1、求最大公约数和最小公倍数
程序分析:
(1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数;
(2)求最大公约数用辗转相除法(又名欧几里德算法)
求a/b的余数;若r=0则b为最大公约数;
如果r!=0则把b的值给a,r的值给a;
#include<stdio.h>
int main()
{
int a,b,t,r,n;
printf("请输入两个数字:\n");
scanf("%d %d",&a,&b);
if(a<b){//保证b为较小数
t=b;b=a;a=t;
}
r=a%b;
n=a*b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
printf("这两个数的最大公约数是%d,最小公倍数是%d\n",b,n/b);
return 0;
}
1.2、输入n个整数,依次输出每个数的约数的个数
#include<stdio.h>
int main(){
int N,n,i,s,r;
while(scanf("%d",&N) != EOF){
while(N--){
scanf("%d",&n);
s = 1;
for (i = 2; i * i <= n; i++) {
r = 0;
while (n % i == 0) {
r++;
n /= i;
}
if (r > 0) {
r++;
s *= r;
}
}
if (n > 1)
s *= 2;
printf("%d\n", s);
}
}
}
1.3、给个n,求1到n的所有数的约数个数的和
#include <iostream>
using namespace std;
int main()
{
long i,res,n;
cin>>n;
res=n-n/2;
for(i=1;i<=n/2;i++)
res+=n/i;
cout<<res;
return 0;
}
2、求100之内的素数
#include<stdio.h>
int main()
{
int i,k;
for(i=2;i<=100;i++)
{
int p=1; //用p来判断当前数是否是质数 ,p=1是质数,p=0不是质数
for(k=2;k<i;k++)
{
if(i % k == 0)
{
p=0;
break;
}
}
if(p == 1)
printf("%d ",i);
}
}
3、判断101-200之间有多少个素数,并输出所有素数。
#include <stdio.h>
int main()
{
int i,j;
int count=0;
for (i=101; i<=200; i++)
{
for (j=2; j<i; j++)
{
// 如果j能被i整出在跳出循环
if (i%j==0)
break;
}
// 判断循环是否提前跳出,如果j<i说明在2~j之间,i有可整出的数
if (j>=i)
{
count++;
printf("%d ",i);
// 换行,用count计数,每五个数换行
if (count % 5 == 0)
printf("\n");
}
}
return 0;
}
3.1、输出第k个质数
#include <iostream>
#include <cmath>
using namespace std;
int prime[10100];
int main()
{
long num = 0,i,j;
long n=105000;
for(i=2; i<=n; i++)
{
for(j=2; j<=sqrt(i); j++)
{
if( i%j==0 ) break;
}
if( j>sqrt(i) )
prime[num++] = i; //这个prime[]是int型,跟下面讲的不同。
}
int k;
while(cin>>k)
{
cout<<prime[k-1]<<endl;
}
return 0;
}
4、判断一个素数能被几个9整除
#include<stdio.h>
#include<stdlib.h>
int main()
{
int p,i;
long int sum=9;
printf("请输入一个素数:\n");
scanf("%d",&p);
for(i=1;;i++)
if(sum%p==0)break;
else sum=sum*10+9;
printf("素数%d能整除%d个9组成的数%ld\n",p,i,sum);
return 0;
}
5、将一个正整数分解质因数
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。
(2)但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n.重复执行第二步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
#include<stdio.h>
int main()
{
int n,i;
printf("请输入整数:");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n%i==0)
{
printf("%d",i);
n/=i;
if(n!=1) printf("*");
}
}
printf("\n");
return 0;
}
6、打印出所有的“水仙花数”
“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
#include<stdio.h>
int main()
{
int i,x,y,z;
for(i=100;i<1000;i++)
{
x=i%10;
y=i/10%10;
z=i/100%10;
if(i==(x*x*x+y*y*y+z*z*z))
printf("%d\n",i);
}
return 0;
}
7、一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
long int i, x, y, z;
for(i = 0; i < 100000; i++)
{
x = sqrt(i + 100);
y = sqrt(i + 268);
if(x*x == (i + 100) && y*y == (i + 268)) //完全平方数:自己*自己=数的平方形式
{
printf("\n%ld\n",i);
}
}
return 0;
}
8、编程找出1000以内的所有完数。
一个数如果恰好等于它的因子之和,这个数就称为完数,
例如6 = 1 + 2 + 3。
#include <stdio.h>
int main(){
int n, sum;
int i;
for(n=1; n<=1000; n++)
{
sum = 0;
for(i=1; i<n; i++)
if(n % i == 0)
sum += i;
if(sum == n)
{
printf("%d=1", n);
for(i=2; i<n; i++)
if(n % i == 0)
printf("+%d", i);
printf("\n");
}
}
}
9、求对称数
将一个数的数码倒过来所得到的新数,叫作原数的反序数,如果一个数等于它的反序数,则称它为对称数。编写程序,采用递归算法求不超过1993的最大的二进制的对称数。
#include <iostream>
#include <cmath>
using namespace std;
long long bin(long long dec)
{
long long d, i=0;
long long bi=0;
while(dec!=0)
{
d=(dec%2)*pow(10,i);
bi=bi+d;
dec=dec/2;
i=i+1;
}
return bi;
}
int dui(long long bi)
{
long long d=0,b=bi;
while(b!=0)
{
d=d*10+b%10;
b=b/10;
}
if(d==bi)
return 1;
else
return 0;
}
int main()
{
long long a;
long long b;
int flag;
for(a=1993;a>=0;a--)
{
b=bin(a);
flag=dui(b);
if(flag==1)
{
cout<<a<<endl<<b<<endl;
break;
}
}
return 0;
}
10、求555555的约数中最大的三位数是多少。
#include<stdio.h>
int main()
{
int i;
for(i=999;i>=100;i--){
if(555555%i==0){
printf("最大的约数:%d\n",i);
return 0;
}
}
return 0;
}
11、有限 5 位数
求个位数为 6 且能被 3 整除的五位数共有多少?
#include <stdio.h>
int main(int argc, char *argv[])
{
int count=0;
int n1,n2,n3,n4;
for (int i = 1000; i <= 9999; ++i)
{
n1=i%10;
n2=(i/10)%10;
n3=(i/100)%10;
n4=(i/1000);
if (0== (n1+n2+n3+n4)%3 ) count++;
}
printf ("the total number is %d\n", count);
return 0;
}
12、 除不尽的数
一个自然数被 8 除余 1,所得的商被 8 除也余 1,再将第二次的商被8 除后余7,最后得到一个商为 a。又知这个自然数被 17 除余 4,所得的商被 17 除余15,最后得到一个商是a 的 2 倍。求这个自然数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n=0;
while(1) //执行了break语句之后才会跳出循环体
{
if(n%8==1 && n/8%8==1 && n/8/8%8==7)
if(n%17==4 && n/17%17==15)
if(n/17/17 == 2*(n/8/8/8))
{
printf("%d",n);
break;
}
n++;
}
return 0;
}
13、一个奇异的三位数
一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码正好相反,求这个三位数。
#include <stdio.h>
int main()
{
int i,j,k;
for( i = 1;i < 7;i++ )
{
for( j = 0;j < 7;j++ )
{
for( k = 1;k < 7;k++ )
{
if( (i*7*7 + j*7 + k) == (k*9*9 + j*9 + i))
{
printf("The special number with 3 digits is:\n");
printf("%d%d%d(7) = %d%d%d(9) = %d(10)\n",i,j,k,k,j,i,k*9*9 + j*9 + i);
}
}
}
}
return 0;
}
14、位反序数
设 N 是一个四位数,它的 9 倍恰好是其反序数,求 N。反序数就是将整数的数字倒过来形成的整数。例如:1234 的反序数是 4321。
#include<stdio.h>
int main()
{
int i,n,n1,n2;
for(i=1000;i<2000;i++)
{
n=i;
n1=n;
n2=0;
while(n1)
{
n2=n1%10+n2*10;
n1 /= 10;
}
n2 /= 9;
if(n2==n)
{
printf("%d\n",i);
}
}
return 0;
}
15、阿姆斯特朗数
如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。
如 407=43+03+73 就是一个阿姆斯特朗数。试编程求 1000 以内的所有阿姆斯特朗数。
#include <stdio.h>
int CalcArmstrongNumber(int n)
{
/*在这里实现功能*/
int a[10]={0};
int num = 0;
int i = 0;
int count = 0;
int temp = 0;
int temp1;
if(n>=2 && n<=65536)//判断数是不是在范围内
{
for(int k=2;k<=n;k++)//要循环判断其以下的数
{
temp1=k;
while(temp1>9)//求多位数的每一位存在数组里面
{
a[i]=temp1%10;
temp1=temp1/10;
i++;
}
a[i]=temp1;
count=i+1;
for(int j=0;j<count;j++)//计算每位数的三次方值再相加
{
temp+=a[j]*a[j]*a[j];
}
if(temp==k)//进行对比看看是不是阿姆斯特朗数
{
printf("%d\n",k);
num++;
}
temp=0;//要复位
count=0;
i=0;
}
}
return num;
}
int main()
{
int n;
printf("请输入数值n:");
scanf("%d",&n,10);
printf("\n%d以下总的有%d的阿姆斯特朗数",n,CalcArmstrongNumber(n));
getchar();
getchar();
}
16、亲密数
如果整数 A 的全部因子(包括 1,不包括 A 本身)之和等于 B;且整数B 的全部因子(包括 1,不包括 B 本身)之和等于 A,则将整数 A 和 B 称为亲密数。求3000 以内的全部亲密数。
#include <stdio.h>
#include<math.h>
int main( )
{
int n,i,sum,s,k=1; //在这里我加了一个K,我需要用这个k来控制输出的格式
for(n=2;n<=3000;n++)//开始,还是遍历2~3000,这个是大循环条件,没有办法
{
sum=1;
for(i=2;i<=sqrt(n);i++)//这里我用了一个开方来求因数的方法,这个方法比直接遍历来的快很多,减少了很多的时间。这里的两个for循环是用来判断n是否为亲密数的。
{
if(n%i==0)
sum+=(i+n/i);
}
s=1;
for(i=2;i<=sqrt(sum);i++)
{
if(sum%i==0)
s+=(i+sum/i);
}
if(n==s && n!=sum && k%2!=0)//这里的判断条件有好几个,都是按照题目要求写出来的。
{
printf("(%d,",n);
k=k+1;
}
else if(n==s && n!=sum && k%2==0)
{
printf("%d)",n);
k=k+1;
}
}
return 0;
}
17、自守数
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:252=625 762=5776 93762=87909376 请求出 200000 以内的自守数
#include<stdio.h>
int zishou(int x)//自定义函数用来检验是否为自守数
{
int y,a,b,c,d,e,z=0,m=1;
y=x*x;
a=x;
while(a>0){
a/=10;
b=y%10;
y/=10;
z+=b*m;
m*=10;
}//注意自守数是指这个数的平方的后几位(而不是后两位)是这个数
if(z==x)
return 1;
else
return 0;
}
int main()
{
int i,k=0,b;
scanf("%d",&b);
for(i=0;i<=b;i++){
if(zishou(i)){
printf("%d\n",i);
k=1;
}
}
if(k==0){
printf("None");
}
return 0;
}
18、求具有 abcd=(ab+cd)2 性质的四位数
3025 这个数具有一种独特的性质:将它平分为二段,即 30 和 25,使之相加后求平方,即(30+25)2,恰好等于 3025 本身。请求出具有这样性质的全部四位数。
#include <iostream>
using namespace std;
int main()
{
int i;
int a,b;
for (i=1000;i<=9999;i++)
{
a=i/100;
b=i%100;
if ((a+b)*(a+b)==i)
cout <<i<<endl;
}
return 0;
}
19、将真分数分解为埃及分数
分子为 1 的分数称为埃及分数,现输入一个真分数,请将该分数分解为埃及分数。
#include <iostream>
#include <cstring>
using namespace std;
int main(){
string s;
while(cin>>s){
string s1, s2;
int a = 0, b = 0, c = 0, r = 0;
int n = s.length();
int x = s.find('/');
s1 = s.substr(0,x);
s2 = s.substr(x+1);
//cout << "x:" << x << " s1: " << s1 << " s2: " << s2 << endl;
for(int i = 0; i < s1.length(); i++){
a = a * 10 + s1[i]-'0';
}
for(int i = 0; i < s2.length(); i++){
b = b * 10 + s2[i]-'0';
}
//cout << a << " " << b << endl;
r = b%a;
if(r == 0){
cout << "1/" << b/a << endl;
continue;
}
while( r != 0){
c = b/a + 1;
cout << "1/" << c << "+";
a = a * c - b;
b = b * c;
r = b%a;
}
cout << "1/"<< b/a << endl;
}
return 0;
}
20、大整数的因子
已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k.
#include<iostream>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
int tmp;int i;
for(tmp=0,i=0;i<str.size();i++)
{
tmp*=10;
tmp+=(str[i]-'0');
if(tmp>=100000000)
tmp%=2520; //2520是2~9的最小公倍数
}
bool have=false; //是否有因数
for(i=2;i<=9;i++)
{
if(tmp%i==0) //能整除
{
if(have==false) //第一个因数输出时前面没有空格
cout<<i;
else
cout<<' '<<i;
have=true;
}
}
if(have==false)cout<<"none";
cout<<endl;
}
}
21、与7无关的数
一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数.现求所有小于等于n(n < 100)的与7无关的正整数的平方和.
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n, sum=0;
cin >> n;
bool b;
for (int i=1; i<=n; i++){
b = false; // 假设与7无关
if (i%7==0 || i%10==7 || (i/10==7))
b=true; // 假设不成立
if (!b) sum += i*i;
}
cout << sum;
return 0;
}
22、菲波那切数列
(1)输出菲波拉契(Fibonacci)数列的前N项数据
#include<stdio.h>
int fib(int n)
{
if(n == 1 || n == 2)
return 1;
else
return (fib(n-1)+fib(n-2));
}
int main()
{
int i,n;
printf("输入数列个数n:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
printf("%d\t",fib(i));
printf("\n");
return 0;
}
(2)输出菲波拉契(Fibonacci)数列的第N项数据
#include<stdio.h>
#include<stdlib.h>
int facibo(int n)
{
if ((n == 1) || (n == 2))
{
return 1;
}
else
{
return facibo(n - 1) + facibo(n - 2);
}
return 0;
}
int main()
{
int a = 0;
printf("请输入a的值:");
scanf("%d", &a);
printf("%d\n", facibo(a));
system("pause");
return 0;
}
(3)
c语言求斐波那契数列前20项奇数的和
#include <stdio.h>
int main()
{
int sum=0,a=0,b,t=1;
for(int i=2;i<=20;i++)
{
if(t%2==1)
{
sum=sum+t;
}
//保存前一项的t
b=t;
//计算前两项之和
t=a+t;
//保存前一项的t
a=b;
}
printf("%d",sum);
return 0;
}