复习算法设计与分析
T1孪生数(本质:((A因子之和)的因子之和)==A)(A的因子之和等于B,B的因子之和等于A)
给定搜索范围m和n,(1<=m<n<=20000),求指定范围内的孪生数。
#include<stdio.h>
void istwins(int m,int n)
{int i,j,s,a[20000]; //构造a[i]数组存放满足条件的相应的i的因子之和for(i=m;i<=n;i++)a[i]=0;for(i=m;i<=n;i++){s=0; //i的因子之和sfor(j=1;j<i;j++)if(i%j==0) s+=j;if(s>=m&&s<=n&&s!=i) //判断因子之和是否在给定范围中a[i]=s;}for(i=m;i<=n;i++)if(i==a[a[i]]){printf("%d %d\n",i,a[i]);a[a[i]]=0; //重点,避免重复比较和输出(请读者思考)}
}main()
{int n,m;scanf("%d%d",&m,&n);istwins(m,n);
}
运行结果
输入:100 300
输出:220 284
T2输出n阶螺旋阵
#include <stdio.h>
void spiralsquare(int n)
{int i,j,a[100][100],k=1;for(i=0;i<n/2;i++) //i控制外层循环即全书{for(j=i;j<=n-2-i;j++) //j控制行列变换,将每圈中一侧的数据存入数组中a[i][j]=k++;for(j=i;j<=n-2-i;j++)a[j][n-1-i]=k++;for(j=n-1-i;j>=i+1;j--)a[n-1-i][j]=k++;for(j=n-1-i;j>=i+1;j--)a[j][i]=k++;}if(n%2==1) //若为奇数阶方阵,最中心数据通过下标给定{i=n/2;a[i][i]=n*n;}for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%3d",a[i][j]);printf("\n");}
}main()
{int n;scanf("%d",&n);spiralsquare(n);
}
T3输出1000至10000之内的可逆素数
#include <stdio.h>
#include <math.h>int reverse(int n) { // 反序函数int r = 0;while (n) {r = r * 10 + n % 10;n /= 10;}return r;
}int isPrime(int n) { // 判断素数函数if (n < 2) {return 0;}for (int i = 2; i <= sqrt(n); i++) {if (n % i == 0) {return 0;}}return 1;
}int main() {printf("1000到10000之间的可逆素数有:\n");for (int i = 1000; i <= 10000; i++) {if (isPrime(i) && isPrime(reverse(i))) {printf("%d ", i);}}printf("\n");return 0;
}
T4两个数只差为2的素数,称为孪生素数。试着输出5组孪生素数。
#include <stdio.h>
#include <stdbool.h>bool isPrime(int num) {if (num <= 1) {return false;}for (int i = 2; i * i <= num; i++) {if (num % i == 0) {return false;}}return true;
}int main() {int count = 0;int num = 3;while (count < 5) {if (isPrime(num) && isPrime(num + 2)) {printf("(%d, %d)\n", num, num + 2);count++;}num++;}return 0;
}
T5输出1000至10000之内的对称数,并输出对称数的个数(3种解法)
#include <stdio.h>
#include <string.h>int main()
{int count = 0;for(int i = 1000; i <= 10000; i++){char str[10];sprintf(str, "%d", i); // 将整数转换为字符串int len = strlen(str);int flag = 1;for(int j = 0; j < len/2; j++){if(str[j] != str[len-j-1]) // 判断是否对称{flag = 0;break;}}if(flag == 1) // 如果是对称数,则输出{printf("%d ", i);count++;}}printf("\n一共有%d个对称数\n", count);return 0;
}
#include <stdio.h>
#include <stdlib.h>int main()
{int count = 0;for (int i = 1000; i <= 10000; i++){int a = i % 10; // 个位数int b = i / 10 % 10; // 十位数int c = i / 100 % 10; // 百位数int d = i / 1000; // 千位数if (a == d && b == c){printf("%d ", i);count++;}}printf("\n对称数的个数为%d\n", count);return 0;
}
#include <stdio.h>
#include <stdlib.h>int main()
{int count = 0;for (int i = 1000; i <= 10000; i++){int x = i, y = 0;while (x > 0){y = y * 10 + x % 10;x /= 10;}if (y == i){printf("%d ", i);count++;}}printf("\n对称数的个数为%d\n", count);return 0;
}
未完待续......