【项目1-完数】
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3,再如8的因子和是7(即1+2+4),8不是完数。
(1)输入一个数n,判断n是否是完数
(2)输出1000以内的所有完数
(3)亲密数:如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。(提示:按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。)
解法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int iXin;//输入的数字
int i;
int sum;
int m;
printf("please input a number:");
scanf("%d",&iXin);//读入输入数字
for(m=2;m<=iXin;++m)
{
for(i=1;i<m;++i)
{
if (m%i==0)
sum=sum+i;
}
if(sum==m)
printf("%d ",m);
sum=0;
}
return 0;
}
【项目2 - n=a!+b!+c!】
求满足条件n=a!+b!+c!的所有三位数n并输出,其中a,b,c分别为n的百、十、个位数。
解法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m;
int a,b,c;//个位数,十位数,百位数
int iMulti_a,iMulti_b,iMulti_c;
int sum;
int i,j,k;
printf("please enter a number less than 1000:");
scanf("%d",&n);
for (m=144;m<=n;++m)
{
a=m%10;
b=(m/10)%10;
c=m/100;
iMulti_a=1;
iMulti_b=1;
iMulti_c=1;
sum=0;
if(a!=0)
{
for(i=1;i<=a;++i)
{
iMulti_a = iMulti_a*i;
}
}
else iMulti_a=0;
sum+=iMulti_a;
if(b!=0)
{
for(j=1;j<=b;++j)
{
iMulti_b =iMulti_b*j;
}
}
else iMulti_b=0;
sum+=iMulti_b;
if(c!=0)
{
for(k=1;k<=c;++k)
{
iMulti_c =iMulti_c * k;
}
}
else iMulti_c=0;
sum+=iMulti_c;
if(sum==m)
printf("%d",m);
}
return 0;
}
【项目3-反序数】
(1)输入一个正整数,输出它的反序数(反序数,即将其所有位的数字反过来。例如,123是321的反序数)
(2)求1000000以内的正整数n,要求9n是n的反序数。
解法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;//输入整数
int m;
int k;
for(n=1;n<=1000000;++n)
{
k=n;
m=0;
while(k>0)
{
m=10*m+k%10;
k=k/10;
}
if(m==9*n)
printf("%d ",n);
}
printf("\n");
return 0;
}
【项目4-回文数】
(1)输入一个正整数,判断其是否为一个回文数(例1221、12321都是回文数,正着看、倒着看,是同一个数)。
(2)输出10000以内的所有回文数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m;
int iReverse_n;
int k;
printf("please enter a number n:");
scanf("%d",&n);
for (m=1;m<=n;++m)
{
k=m;
iReverse_n=0;
while(k>0)
{
iReverse_n=10*iReverse_n+k%10;
k=k/10;
}
if(iReverse_n==m)
printf("%d ",m);
}
return 0;
}
//任意输入数字以内所有的回文数
【项目5-阿姆斯特朗数】
如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。如 407=43+03+73就是一个阿姆斯特朗数。试编程求1000以内的所有阿姆斯特朗数。
解法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m;
int iA_n;
int a;
int k;
printf("please enter a number:");
scanf("%d",&n);
for(m=1;m<=n;++m)
{
iA_n=0;
a=0;
k=m;
while(k>0)
{
a=k%10;
iA_n=iA_n+(a*a*a);
k=k/10;
}
if(iA_n==m)
printf("%d ",m);
}
return 0;
}
【项目6-回文日】
很有趣的一个题目:2011年11月02日是一个回文日:2011 1102,在2011级同学做这道题时我们刚刚度过这一天!请列出本世纪还有多少个回文日(假如我们能活到百岁,你和我的……)。注意:一年只有12个月。
解法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int iData;//输入日期的上限
int iYear,iMonth,iDay;//分离日期的年 月 日
int iData_n;//迭代日期
int iReverse_data;//回文日期
int a;//时间表达式
int k;//分离日期的各位数
printf("please enter a upper limit of the data:");
scanf("%d",&iData);
for (iData_n=20111301;iData_n<=iData;++iData_n)
{
iYear=iData_n/10000;
iMonth=iData_n/100%100;
iDay=iData_n%100;
iReverse_data=0;
k=iData_n;
if(iMonth>0&& iMonth<=12)
{
if(iMonth==1||iMonth==3||iMonth==5||iMonth==7||iMonth==8||iMonth==10||iMonth==12)
a=1;
else if(iMonth==4||iMonth==6||iMonth==9||iMonth==11)
a=2;
else if(iMonth==2)
a=3;
}
else continue;
switch(a)
{
case 1:
{
if(iDay>0&&iDay<=31)
{
while(k>0)
{
iReverse_data=10*iReverse_data+k%10;
k=k/10;
}
}
if(iReverse_data==iData)
printf("%d" ,iData);
}
case 2:
{
if(iDay>0&&iDay<=30)
{
while(k>0)
{
iReverse_data=10*iReverse_data+k%10;
k=k/10;
}
}
if(iReverse_data==iData)
printf("%d" ,iData_n);
}
case 3:
{
if(iYear%4==0 && iYear%400==0)
{
if(iDay>0&&iDay<=29)
{
while(k>0)
{
iReverse_data=10*iReverse_data+k%10;
k=k/10;
}
}
if(iReverse_data==iData)
printf("%d" ,iData);
}
else
{
if(iDay>0&&iDay<=28)
{
while(k>0)
{
iReverse_data=10*iReverse_data+k%10;
k=k/10;
}
}
if(iReverse_data==iData_n)
printf("%d ",iData_n);
}
}
}
}
return 0;
}