在計算機等級考試二級C語言程式設計試題中,有關一個正整數各位數字的處理是一個重要的考點,這類試題在歷年考試試卷的程式填空題和程式設計題中經常出現,
一.實體決議
例1 撰寫函式fun,它的功能是:找出100~x(x<=999)之間所有整數中各位上數字之和為15的整數,然后輸出;符合條件的整數個數作為函式值回傳,
例如,若x=500時,100~500之間各位上數字之和為15的整數有:159、168、177、186、195、249、258、267、276、285、294、339、348、357、366、375、384、393、429、438、447、456、465、474、483、492,共有26個,
#include <stdio.h>
int fun(int x)
{
}
int main()
{
int x=-1;
while(x>999||x<0)
{
printf("Please input(0<x<=999): ");
scanf("%d",&x);
}
printf("\nThe result is: %d\n",fun(x));
return 0;
}
決議:由于程式中給定的整數t是一個3位數,因此可以用s3、s2和s1三個變數分別保存給定整數t的百位數字、十位數字和個位數字,顯然
s3=t/100; s2=t/10%10; s1=t%10;
用一重回圈對100~x之間的所有整數t進行窮舉,若各位數字之和s1+s2+s3等于15,則輸出t并計數,
撰寫的fun函式如下:
int fun(int x)
{
int n, s1, s2, s3, t;
n=0;
t=100;
while (t<= x)
{
s1=t%10; s2=(t/10)%10; s3=t/100;
if(s1+s2+s3==15)
{
printf("%d ",t);
n++;
}
t++;
}
return n;
}
例2 撰寫函式fun,它的功能是:計算無符號整數num的各位上的數字之和,
例如,若輸入250,則輸出應為7;若輸入123456,則輸出應為21,
#include <stdio.h>
unsigned fun(unsigned num)
{
}
int main()
{
unsigned n;
printf("Please enter a number:");
scanf("%ud",&n);
printf("\n%u\n",fun(n));
return 0;
}
決議:由于題目未給定整數num的位數,因此像例1那樣采用多個變數分別保存num的各位數字,并通過對num進行算術運算得到各位上的數字的方法不適用,
實際上,對于任意一個非負整數num,num%10可以得到num的個位數,num=num/10會將num的個位數丟掉,這樣,通過回圈不斷求得num的個位數并丟掉個位數,可以將num各位上的數字依次分離出來,其操作步驟為:
1)分離出num的個位數,即num%10,
2)將num除以10,作為新的num,即新的num丟掉了個位數,
3)如果num等于0,分離完畢,結束,否則,轉第1)步,繼續分離各位數字,
例如,num=1234,num%10=4,num=1234/10=123,得到數字4;
num%10=3,num=123/10=12,得到數字3;
num%10=2,num=12/10=1,得到數字2;
num%10=1,num=1/10=0,得到數字1;結束,
將每次分離出的個位數累加起來,就得到num的各位數字之和,
撰寫的fun函式如下:
unsigned fun(unsigned num)
{
unsigned s=0;
do
{
s+=num%10;
num/=10;
} while(num);
return s;
}
例3 撰寫函式fun,它的功能是:求整數number的逆序數,
例如,若輸入12345,則輸出應為54321;若輸入-1240,則輸出應為-421,
#include <stdio.h>
int fun(int number)
{
}
int main()
{
int n;
printf("Please enter a number:");
scanf("%d",&n);
printf("\n%d\n",fun(n));
return 0;
}
決議:由于number可能為負數,置符號t初值為1(表示正數),若number為負數,則置符號t=-1,且number=-number,這樣將number都作為無符號整數處理,
按例2的方法分離出number的各位數字,例如,若number=1234,則依次分離出數字4、3、2和1,如何將數字4、3、2、1合并成整數4321呢?
由于 4321=4*1000+3*100+2*10+1
= (((0*10 + 4)*10 + 3)*10 + 2)*10 + 1
因此可設s的初始值為0,每分離一個數字d后,加到s的后面,即s=s*10+d,可得number的逆序數s,
撰寫的fun函式如下:
int fun(int number)
{
int t=1,s;
s=0;
if (number<0)
{
t=-1;
number=-number;
}
while (number!=0)
{
s=s*10+number%10;
number/=10;
}
return t*s;
}
例4 撰寫函式fun,它的功能是:將無符號整數n中各位上為奇數的數去除,剩下的數按原來從高位到低位的順序組成一個新的數,并通過函式值回傳,
例如,輸入一個數:27835496,新的數為:2846,
#include <stdio.h>
unsigned int fun(unsigned int n)
{
}
int main()
{
unsigned n=-1;
while(n>99999999||n<0)
{
printf("Please input(0<n<100000000): ");
scanf("%ud",&n);
}
printf("\nThe result is: %u\n",fun(n));
return 0;
}
決議:同樣按例2的方法分離出無符號整數n的各位數字,例如,若n=27835496,則依次分離出數字6,9,4,5,3,8,7,2,去掉奇數后,剩下的數字為6,4,8,2,如何將數字6、4、8、2合并成整數2846呢?
由于 2846=2 * 1000 + 8 * 100 + 4 * 10 + 6 * 1,
=2 * 10*10*10*1 + 8 * 10*10*1 + 4 * 10*1 + 6 * 1
因此可設s的初始值為0,i初始值為1,每分離一個數字d后,執行s=d*i+s和 i=i*10,可求得對應結果s,
撰寫的fun函式如下:
unsigned int fun(unsigned int n)
{
unsigned int x=0, i;
int t;
i=1;
while(n)
{
t=n % 10;
if (t%2==0)
{
x=x+t*i;
i=i*10;
}
n =n /10;
}
return x;
}
二.程式設計題
1.撰寫函式fun,它的功能是:找出100~999之間(含100和999)所有整數中各位上數字之和為x(x為一正整數)的整數,然后輸出;符合條件的整數個數作為函式值回傳,
例如,若x=5時,100~999之間各位上數字之和為5的整數有:104、113、122、131、140、203、212、230、302、311、320、401、410、500,共有15個,
#include <stdio.h>
int fun(int x)
{
}
int main()
{
int x=-1;
while(x<0)
{
printf("Please input(x>0): ");
scanf("%d",&x);
}
printf("\nThe result is: %d\n",fun(x));
return 0;
}
int fun(int x) { int n, s1, s2, s3, t; n=0; t=100; while (t<=999) { s1=t%10; s2=(t/10)%10; s3=t/100; if(s1+s2+s3==x) { printf("%d ",t); n++; } t++; } return n; }參考程式
2.撰寫函式fun,它的功能是:計算num的各位上的數字之積,
例如,若輸入252,則輸出應為20;若輸入202,則輸出應為0,
#include <stdio.h>
long fun(long num)
{
}
int main()
{
long n;
printf("Please enter a number:");
scanf("%ld",&n);
printf("\n%ld\n",fun(n));
return 0;
}
long fun(long num) { long k=1; do { k*=num%10; num/=10; } while(num); return (k); }參考程式
3.撰寫函式fun,它的功能是:將形參n中各位上為偶數的數取出,并按原來從高位到低位相反的順序組成一個新的數,并作為函式值回傳,
例如,若n=27638496,得到的新數為:64862,
#include <stdio.h>
unsigned long fun(unsigned long n)
{
}
int main()
{
unsigned long n=-1;
while(n>99999999||n<0)
{
printf("Please input(0<n<100000000): ");
scanf("%ld",&n);
}
printf("\nThe result is: %ld\n",fun(n));
return 0;
}
unsigned long fun(unsigned long n) { unsigned long x=0; int t; while(n) { t=n%10; if(t%2==0) x= x*10+t; n= n/10; } return x; }參考程式
4.撰寫函式fun,其功能是:將長整數s中每一位上為偶數的數依次取出,構成一個新數放在t中,高位仍在高位,低位仍在低位,
例如,s=87653142時,t=8642,
#include <stdio.h>
void fun(long s, long *t)
{
}
int main()
{
long s, t;
printf("\nPlease enter s:");
scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);
return 0;
}
void fun(long s, long *t) { int d; long sl=1; *t = 0; while ( s > 0) { d = s%10; if (d%2==0) { *t=d* sl+ *t; sl *= 10; } s /= 10; } }參考程式
5.撰寫函式fun,它的功能是:將形參n所指變數中,各位上為偶數的數去除,剩下的數按原來從高位到低位的順序組成一個新的數,并通過形參指標n傳回所指變數,
例如,輸入一個數:27638496,新的數為:739,
#include <stdio.h>
void fun(unsigned long *n)
{
}
int main()
{
unsigned long n=-1;
while(n>99999999||n<0)
{
printf("Please input(0<n<100000000): ");
scanf("%ld",&n);
}
fun(&n);
printf("\nThe result is: %ld\n",n);
return 0;
}
void fun(unsigned long *n) { unsigned long x=0, i; int t; i=1; while(*n) { t=*n % 10; if(t%2!=0) { x=x+t*i; i=i*10; } *n =*n /10; } *n=x; }參考程式
6.撰寫函式fun,其功能是:判斷無符號整數n是否為回文數,若是,函式回傳1,否則回傳0,回文數是指順讀和倒讀都一樣的數,
例如,12321是回文數,而12312就不是回文數,
#include <stdio.h>
int fun(unsigned int n)
{
}
int main()
{
unsigned int n=-1;
while(n>99999999||n<0)
{
printf("Please input(0<n<100000000): ");
scanf("%ud",&n);
}
if(fun(n)) printf(" YES\n") ;
else printf(" NO\n") ;
return 0;
}
int fun(unsigned int n) { unsigned int t,s=0; t=n; while (t) { s=s*10+t%10; t/=10; } if (s==n) return 1; else return 0; }參考程式
7.撰寫函式fun,它的功能是:統計一個無符號整數中各位數字值為零的個數,通過形參傳回主函式,并把該整數中各位上最大的數字值作為函式值回傳,
例如,若輸入無符號整數30800,則數字值為零的個數為3,各位上數字值最大的是8,
#include <stdio.h>
int fun(unsigned n, int *zero)
{
}
int main()
{
unsigned n;
int zero,max;
printf("\nInput n(unsigned): ");
scanf("%d",&n);
max = fun( n,&zero );
printf("\nThe result: max=%d zero=%d\n",max,zero);
return 0;
}
int fun(unsigned n, int *zero) { int count=0,max=0,t; do { t=n%10; if(t==0) count++; if(max<t) max=t; n=n/10; }while(n); *zero=count; return max; }參考程式
8.撰寫函式fun,它的功能是:求出n位整數w(w>10)的后n-1位的數作為函式值回傳,
例如,若w值為5923,則函式回傳923;w為923,函式回傳23,
#include <stdio.h>
unsigned fun(unsigned w)
{
}
int main()
{
unsigned x;
printf("Enter a unsigned integer number :" );
scanf("%u", &x );
printf("The original data is : %u\n", x);
if (x < 10) printf ("Data error !");
else printf("The result : %u\n", fun(x));
return 0;
}
unsigned fun(unsigned w) { unsigned x=0,d,p=1; while (w>=10) { d=w%10; x=p*d+x; p=p*10; w=w/10; } return x; }參考程式
9.撰寫函式fun,它的功能是:統計整型變數m中各數字出現的次數,并存放到陣列a中,其中,a[0]存放0出現的次數,a[1]存放1出現的次數,……,a[9]存放9出現的次數,
例如,若m為14579233,則輸出結果為:0,1,1,2,1,1,0,1,0,1,
#include <stdio.h>
void fun( int m, int a[10])
{
}
int main()
{
int m, a[10],i;
printf("請輸入一個整數 : "); scanf("%d", &m);
fun(m, a);
for (i=0; i<10; i++) printf("%d,",a[i]);
printf("\n");
return 0;
}
void fun( int m, int a[10]) { int i; for (i=0; i<10; i++) a[i] = 0; while (m > 0) { i = m%10; a[i]++; m = m/10; } }參考程式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/532510.html
標籤:C
下一篇:冷知識:預處理字串運算子
