复习算法设计与分析
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的因子之和s
for(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;
}
T6大数阶乘
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void fac(int n)
{
int long a[256],b,d;
int m,i,j;
m=100;
a[1]=1;
for(i=2;i<=m;i++)
a[i]=0;
d=0;
for(i=2;i<=n;i++)
{
for(j=1;j<=m;j++)
{
b=a[j]*i+d;
a[j]=b%1000000;
d=b/1000000;
}
}
for(i=m;a[i]==0;i--) ;
printf("%ld!=",n);
printf("%ld",a[i]);
for(j=i-1;j>=1;j--)
{
if(a[j]>99999)
printf("%ld ",a[j]);
else if(a[j]>9999)
printf("%0ld ",a[j]);
else if(a[j]>999)
printf("%00ld ",a[j]);
else if(a[j]>99)
printf("%000ld ",a[j]);
else if(a[j]>9)
printf("%0000ld ",a[j]);
else
printf("%00000ld ",a[j]);
}
printf("\n");
}
优化
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void fac(int n)
{
int long a[256],b,d;
int m,i,j;
m=1;
a[1]=1;
for(i=2;i<=m;i++)
a[i]=0;
for(i=2;i<=n;i++)
{
d=0;
for(j=1;j<=m;j++)
{
b=a[j]*i+d;
a[j]=b%1000000;
d=b/1000000;
}
//if(d!=0) {a[j]=d;m=m+1;}
if(d!=0) {m=m+1;a[m]=d;}
}
printf("%ld!=",n);
printf("%ld ",a[m]);
for(j=m-1;j>=1;j--)
if(a[j]>99999)
printf("%ld ",a[j]);
else if(a[j]>9999)
printf("0%ld ",a[j]);
else if(a[j]>999)
printf("00%ld ",a[j]);
else if(a[j]>99)
printf("000%ld ",a[j]);
else if(a[j]>9)
printf("0000%ld ",a[j]);
else
printf("00000%ld ",a[j]);
printf("\n");
}
void main()
{
int n;
printf("input a number:");
scanf("%d",&n);
fac(n);
}
未完待续......