特殊的数相关

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;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值