题目描述算法
将一个正整数分解质因数。例如:输入90,输出 90=2*3*3*5。编程
输入框架
输入数据包含多行,每行是一个正整数n (1<n <100000) 。测试
输出this
对于每一个整数n将其分解质因数。spa
输入样例ip
90input
256it
199io
输出样例
90=2*3*3*5
256=2*2*2*2*2*2*2*2
199=199
对整数n进行分解质因数,应让变量i等于最小的质数2,而后按下述步骤完成:
1)若是i恰等于n,则说明分解质因数的过程已经结束,输出便可。
2)若是n<>i,但n能被i整除,则应输出i的值,并用n除以i的商,做为新的正整数n,转第1)步。
3)若是n不能被i整除,则用i+1做为新的i值,转第1)步。
所以,程序主体是一个循环,在循环中根据n可否整除i,进行两种不一样处理,描述为:
i=2;
while(i<n)
{
if(n%i==0)
{
printf("%d*",i) // i是n的因数,输出i
n=n/i; // 对除以因数后的商在进行分解
}
else
i++; // 找下一个因数
}
#include <stdio.h>
int main()
{
int n,i;
while (scanf("%d",&n)!=EOF)
{
printf("%d=",n);
i=2;
while(i<n)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else
i++;
}
printf("%d\n",n);
}
return 0;
}
题目描述
彻底数(Perfect number)又称完美数或完备数,是一些特殊的天然数。它全部的真因子(即除了自身之外的约数)的和,刚好等于它自己。
例如:第一个彻底数是6,它有约数一、二、三、6,除去它自己6外,其他3个数相加,1+2+3=6。第二个彻底数是28,它有约数一、二、四、七、1四、28,除去它自己28外,其他5个数相加,1+2+4+7+14=28。
编写一个程序,求两个正整数之间彻底数的个数。
输入
输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,而后就是n个测试实例,每一个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<10000) 。
输出
对于每组测试数据,请输出num1和num2之间(包括num1和num2)存在的彻底数个数。
输入样例
2
2 5
5 7
输出样例
0
1
(1)编程思路。
要求num1和num2之间的全部彻底数,须要对num1~num2范围内的每个数n,计算n的全部真因子之和s,若n==s,则n就是一个彻底数。框架描述为:
for(n=num1;n<=num2;n++)
{
计算n的真因子之和s ;
if(s==n)
是彻底数,计数;
}
为计算n的全部真因子之和s,可令s初值为1(1是n的真因子),而后用2~n-1范围内的每一个i去除n,若是n能被i整除(即n%i==0),则i是n的真因子,s=s+i。
实际上,i(i>1)是n的真因子,则n/i也是n的真因子。所以,能够将i的范围缩小为2~sqrt(n)。这样,计算n的真因子之和s的操做描述为:
s=1; // s为n的真因子之和
for(i=2;i<=sqrt(n);i++) // 求解真因子之和
if(n%i==0)
if (i!=n/i) s=s+i+n/i;
else s=s+i;
所以,程序能够写成一个嵌套的二重循环。
(2)源程序。
#include <stdio.h>
#include <math.h>
int main()
{
int t,num1,num2,i,n,s,cnt;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&num1,&num2);
cnt=0;
if (num1>num2) { n=num1; num1=num2; num2=n;}
for(n=num1;n<=num2;n++)
{
s=1; // s为n的真因子之和
for(i=2;i<=sqrt(n);i++) // 求解真因子之和
if(n%i==0)
{
if (i!=n/i) s=s+i+n/i;
else s=s+i;
}
if(s==n) cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
题目描述
遥远的古代,人们发现某些天然数之间有特殊的关系:若是两个数a和b(a不等于b),a的全部真因数之和等于b,b的全部真因数之和等于a,则称a、b是一对亲和数。
例如220和284,1184和1210,2620和2924,5020和5564,6232和6368。
给定一个正整数 S(6≤S≤18000) ,找出a,b两数中至少有一个不小于S的第一对“亲和数” 。
输入格式
一行一个整数S。
输出格式
一行两个整数A 和 B(用空格隔开)。A 表示第一个不小于 S 的有“亲和数”的整数,B是A的“亲和数”。
输入样例 #1
206
输出样例 #1
220 284
输入样例 #2
260
输出样例 #2
284 220
(1)编程思路。
程序对输入整数begin开始的天然数进行穷举,算法描述为:
for(n=begin;;n++)
{
计算n的真因子之和 s ;
if (s==n) continue;
计算s的真因子之和 m ;
if(m==n) // 若是两数相等,是解
{
输出解的状况;
}
}
计算天然数的真因子之和的方法,能够参见前面的习题5-1“彻底数”。
(2)源程序。
#include <stdio.h>
#include <math.h>
int main()
{
int begin,i,n,s,m,k;
scanf("%d",&begin);
for(n=begin;;n++)
{
s=1; // s为n的真因子之和
k=1; // k为n的真因子个数
for(i=2;i<=(int)sqrt(1.0*n);i++) // 求解真因子之和
if(n%i==0)
{
s=s+i+n/i;
k+=2;
}
i--;
if (i*i==n) s-=i;
if(k==1 || s==n) // 若n为质数或完数,进行下次循环
continue;
m=1; // m为s的真因子之和
for(i=2;i<=(int)sqrt(1.0*s);i++)
if(s%i==0)
m+=i+s/i; // 计算s的真因子之和
i--;
if (i*i==s) m-=i;
if(m==n) // 若是两数相等,输出亲和数
{
printf("%d %d\n",n,s);
break;
}
}
return 0;
}
Problem Description
A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ... shows the first 20 humble numbers.
Now given a humble number, please write a program to calculate the number of divisors about this humble number.For examle, 4 is a humble,and it have 3 divisors(1,2,4);12 have 6 divisors.
Input
The input consists of multiple test cases. Each test case consists of one humble number n,and n is in the range of 64-bits signed integer. Input is terminated by a value of zero for n.
Output
For each test case, output its divisor number, one line per case.
Sample Input
4
12
0
Sample Output
3
6
(1)编程思路。
若一个大于1正整数n能够分解质因数:n=(p1^a1)*(p2^a2)*(p3^a3)*…*(pk^ak),
则由约数个数定理可知n的正约数有 (a1+1)(a2+1)(a3+1)…(ak+1)个。
本题要求一个给定丑数n的约数个数,而一个丑数分解质因数后,其质因子只有二、三、5或7这4个,所以只需求出n中分别含有质因子二、三、5和7的个数便可。
(2)源程序。
#include <stdio.h>
int fun(__int64 n,int x) // 求整数n分解质因数后含质因子x的个数
{ int sum=0;
while(n%x==0)
{
sum++;
n/=x;
}
return sum;
}
int main()
{
int cnt1,cnt2,cnt3,cnt4;
__int64 n;
while(scanf("%I64d",&n) && n!=0)
{
cnt1=cnt2=cnt3=cnt4=1;
cnt1+=fun(n,2);
cnt2+=fun(n,3);
cnt3+=fun(n,5);
cnt4+=fun(n,7);
printf("%d\n",cnt1*cnt2*cnt3*cnt4);
}
return 0;
}