6-3
给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。
其中函数fn
须返回的是n
个a
组成的数字;SumA
返回要求的和。
#include <stdio.h>
int fn( int a, int n );
int SumA( int a, int n );
int main()
{
int a, n;
scanf("%d %d", &a, &n);
printf("fn(%d, %d) = %d\n", a, n, fn(a,n));
printf("s = %d\n", SumA(a,n));
return 0;
}
int fn( int a, int n ){
int i,s=0;
for(i=0;i<n;i++){
s=s*10+a;
}
return s;
}
int SumA( int a, int n ){
int i,s=0,j=0;
for(i=0;i<n;i++){
s=s*10+a;
j+=s;
}
return j;
}
6-6
本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
其中函数prime
当用户传入参数p
为素数时返回1,否则返回0;函数Goldbach
按照格式"n
=p+q"输出n
的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。
题目要求:先判断m是否为素数,再计算[m,n]中所有偶数=p+q两个奇素数之和,输出p最小的解
//先判断m是否为素数,再计算[m,n]中所有偶数=p+q两个奇素数之和,输出p最小的解
#include <stdio.h>
int prime( int p );
void Goldbach( int n );
int main()
{
int m, n, i, cnt;
scanf("%d %d", &m, &n);
if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
if ( m < 6 ) m = 6;
if ( m%2 ) m++;
cnt = 0;
for( i=m; i<=n; i+=2 ) {
Goldbach(i);
cnt++;
if ( cnt%5 ) printf(", ");
else printf("\n");
}
return 0;
}
int prime( int p ){
int flag=1,i;
if(p<2){
flag=0;
}else if(p==2){
flag=1;
}
for(i=2;i<p;i++){
if(p%i==0) {
flag=0;
break;
}
}
return flag;
}
void Goldbach( int n ){
int p,q,i,flag=1;
for(p=3;p<n;p++){
if(prime(p)) {
q=n-p;
if(prime(q)) {
printf("%d=%d+%d",n,p,q);break;
}
}
}
}
6-7
本题要求实现一个求整数的逆序数的简单函数。
#include <stdio.h>
int reverse( int number );
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", reverse(n));
return 0;
}
int reverse( int number ){
int a=0;
while(number!=0){
a=a*10+number%10;
number/=10;
}
return a;
}
6-8
本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。
其中函数factorsum
须返回int number
的因子和;函数PrintPN
要逐行输出给定范围[m
, n
]内每个完数的因子累加形式的分解式,每个完数占一行,格式为"完数 = 因子1 + 因子2 + ... + 因子k",其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行"No perfect number"。
#include <stdio.h>
int factorsum( int number );
void PrintPN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);
if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);
PrintPN(m, n);
return 0;
}
int factorsum( int number ){
int i,s=0;
for(i=1;i<number;i++){
if(number%i==0){
s+=i;
}
}
return s;
}
void PrintPN( int m, int n ){
int a[10000],i,j,s,k=0;
for(;m<=n;m++){
s=0,j=0;
for(i=1;i<m;i++){
if(m%i==0){
s+=i;
a[j]=i;
j++;
}
}
if(m==s){
printf("%d = ",m);
printf("%d",a[0]);
for(i=1;i<j;i++){
printf(" + %d",a[i]);
}
printf("\n");
k++;
}
}
if(k==0) printf("No perfect number");
}
6-9
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
其中函数fib
须返回第n
项Fibonacci数;函数PrintFN
要在一行中输出给定范围[m
, n
]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行"No Fibonacci number"。
#include <stdio.h>
int fib( int n );
void PrintFN( int m, int n );
int main()
{
int m, n, t;
scanf("%d %d %d", &m, &n, &t);
printf("fib(%d) = %d\n", t, fib(t));
PrintFN(m, n);
return 0;
}
int fib( int n ){
int s[n],i=2;
s[0]=1;
s[1]=1;
if(n>=3){
do{
s[i]=s[i-1]+s[i-2];
i++;
}while (i!=n);
}
return s[n-1];
}
void PrintFN( int m, int n ){
int s[10000],i=2,j=0,k=0;
s[0]=1;
s[1]=1;
do{
s[i]=s[i-1]+s[i-2];
i++;
j++;
}while (s[i-1]<10000);
for(i=0;i<j;i++){
if(s[i]>=m && s[i]<=n) {
printf("%d ",s[i]);
k++;
}
}
if(k==0) printf("No Fibonacci number");
}
6-11
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数narcissistic
判断number
是否为水仙花数,是则返回1,否则返回0。
函数PrintN
则打印开区间(m
, n
)内所有的水仙花数,每个数字占一行。题目保证100≤m
≤n
≤10000。
#include <stdio.h>
#include <math.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
int narcissistic( int number ){
int n=number,a[10],i=0,s=0,j,flag=0;
while(number%10!=0 || number/10!=0){
a[i]=number%10;
i++;
number/=10;
}
for(j=0;j<i;j++){
s+=pow(a[j],i);
}
if(n==s) flag=1;
return flag;
}
void PrintN( int m, int n ){
for(m+=1;m<n;m++){
if(narcissistic(m)) printf("%d\n",m);
}
}