本人能力有限,发出只为帮助有需要的人。
建议同学们自己写完后再进行讨论。
1自守数(10分)
问题描述:若一个整数a满足条件a*a的尾数等于a则称a为自守数,例如
25*25=625,76*76=5776, 9376*9376=87909376
都是自守数。编写程序,求n以内所有自守数。
输入:从键盘随机输入一个非负整数作为n值。
输出:输出小于n的所有自守数,每行一个。
样例1:输入
10
输出
1
5
6
#include<stdio.h>
long long g(long long x);
int main(void)
{
long long m,j,a,b,k;//必须用long long才能通过
long n;
scanf("%ld",&n);
printf("1\n");//先输出1以控制格式
for(k=2;k<n;k++)//从2开始保证没有多的1
{
m=k*k;
a=10000000;//不要用while算a,会超时,题目已给出a的大小
for(j=a;j>0;j/=10)
{
b=m%j;
if(b==k)
{
printf("%ld\n",k);//注意空格
break;//跳出循环保证不会出现多次一个数
}
}
}
return 0;
}
2正整数分解(10分)
问题描述:对于正整数n(n<=20),输出其和等于n的所有不增的正整数和式。
输入:从键盘随机输入一个正整数n。
输出:所有和为n的正整数和式,每个和式占一行。
样例1:输入
4
输出
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1
样例2:输入
5
输出
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
#include<stdio.h>
int a[100]={0},n;
int check(int flag);//flag标记拆分的数的下标
void print(int flag);
void split(int x,int flag)
{
int i,j,k;
for(i=x-1;i>0;i--)
{
j=x-i;
a[flag]=i;
a[++flag]=j;
if(check(flag))
print(flag);
if(j>1)
split(j,flag);//拆分后的数大于一则递归
flag--;
}
}
int check(int flag)//检查是否递减
{
for(int i=0;i<flag;i++)
if(a[i]<a[i+1])//
return 0;
return 1;
}
void print(int flag)
{
int tem=0;
printf("%d=",n);
for(int i=0;i<=flag;i++)
{
if(tem)
printf("+");
tem=1;
printf("%d",a[i]);
}
printf("\n");
}
int main(void)
{
scanf("%d",&n);
split(n,0);
return 0;
}