资源描述
第1题 (10、0分) 题号:664
题目:已知有结构体类型定义:
struct node
{ int data;
struct node *nextPtr;
};
编写函数void printList(struct node * head),对head指向
得单向链表,找出data成员值为正数得所有结点,输出这些结
点在链表中得序号(第1个结点序号为1)与data成员值。
答案:
void printList(struct node * head)
{
struct node *p;
int i=1;
p=head;
while(p!=NULL)
{
if(p>data > 0) cout<<"\n数据:"<<p>data<<" 序号:"<<i;
i++;
p=p>nextPtr;
}
}
第2题 (10、0分) 题号:693
题目:编写一段程序,计算输入流input中第一个$之前得
字符数目,存入count变量。
答案:while (input、get(ch) && ch != '$')
count++;
第3题 (10、0分) 题号:592
题目: 用“辗转相除方法”计算两个数 x,y 得最大公约
数
答案:
n=x%y;
while(n!=0)
{x=y;y=n;n=x%y;}
第4题 (10、0分) 题号:708
题目:从文件中读入n个字符串,将其中以字母A开头得字符串复制
到二维字符数组str1中。
答案:for(i=0;i<n;i++)
{
if((strcmp(str[i],"A")>=0)&&(strcmp(str[i],"B")<0))
{ strcpy(str1[j],str[i]);
j++;
}
}
第5题 (10、0分) 题号:639
题目:从键盘输入一个正整数n,该正整数可以分解成两个正整数k1
与k2之与(允许k1与k2相等)。请编写一个函数求使两个正
整数得乘积最大得分解方案,并返回乘积max。
答案:
int i,max;
max = 1*(n1);
for(i=2;i<n;i++)
if(i*(ni)>max)
{
max = i*(ni);
}
第6题 (10、0分) 题号:686
题目:写一个函数统计字符串中,大写字母与小写字母
得个数,并分别保存在全局变量Supper与Low中。
答案: int i=0;
while (input[i]!='\0')
{
if(input[i]<='Z' &&input[i] >='A')
Supper++;
if (input[i]<='z' &&input[i] >='a')
Low++;
i++;
}
第7题 (10、0分) 题号:628
题目:求100以内(不含100)能被3整除且个位数为6得所有整数,
答案:
int i,count=0;
for(i=0;i<100;i++)
if(i%3==0 && i%10==6)
{
a[count++]=i;
cout<<i<<" ";
}
第8题 (10、0分) 题号:647
题目:下面程序中得函数void ins(int a[], int len,int n);
将n插入到一个包含len个从小到大排好序得整数数组a中,插入
后保证数组得有序性。完成该函数得编写。例如:
a) 调用ins(a, 0,3)后,数组a中为3
b) 调用ins(a, 1,2)后,数组a中为2,3
c) 调用ins(a, 2,6)后,数组a中为2,3,6
答案: int i;
for (i=len;i>0;i)
{
if (i>0 && a[i1]>n)
a[i] = a[i1];
else
break;
}
a[i] = n;
第9题 (10、0分) 题号:704
题目:编写函数,把一个数字字符组成得字符串转换为相应得整数(如"1234"转换为1234)。
答案:int a2i(char ds[])
{
int v = 0;
for(int i=0; ds[i] != '\0'; i++)
{
v = v*10 + ds[i]'0';
}
return v;
}
第10题 (10、0分) 题号:728
题目:求400之内得一对亲密对数。
所谓亲密对数A与B,即A不等于B,且A得所有因子(如,6得因子就是1、2、3)
之与等于B,B得所有因子之与等于A。
求出得亲密对数存放在A与B中,且A<B。
答案: for(int n=1;n<400;n++)
{ int sum_a=0,sum_b=0;
int a=n,b;
for(int i=1;i<=a/2;i++)
{
if(a%i==0)
sum_a+=i;
}
b=sum_a;
if(b<=400)
{
for(int j=1;j<=b/2;j++)
{
if(b%j==0)
sum_b+=j;
}
if(sum_b==a && a!=b)
{
A=a;
B=b;
break;
}
}
}
第11题 (10、0分) 题号:696
题目:请输出个、十、百位数字各不相同得所有三位数,
结果写入f2、txt中,一个数一行。
要求:输出时按从小到大得顺序输出。
答案:for(i = 0; i < 10; i++)
for(j = 0; j < 10; j++)
for(k = 1; k < 10; k++)
{
if(i != j && j != k && i != k)
{
output << k << j << i;
count++;
if(count == 60)
{
count = 0;
output << endl;
}
else
output << " ";
}
}
第12题 (10、0分) 题号:635
题目:3025这个数具有一种独特得性质:将它平分为二段,即30与25,
使之相加后求平方,即(30+25)*(30+25),恰好等于3025本身。
请求出具有abcd=(ab+cd)*(ab+cd)这样性质得全部四位数并使用变
量num记录满足条件得数得总个数。
要求:调用output函数将求出得数写入文件f2、txt中,例如output(3025)。
答案:
int n,a,b;
for(n=1000;n<10000;n++)
{
a=n/100;
b=n%100;
if((a+b)*(a+b)==n)
{
cout<<n<<' ';
output(n);
num++;
}
}
第13题 (10、0分) 题号:621
题目: 假设文件 "f1、txt" 与 "f2、txt" 以文本方式分别
存放着两个长度相同得实数向量,但就是具体长度未知 。
请编写函数
double prod(char* s1, char* s2)
求二向量得内积。
其中,s1 与s2 分别就是存放两个向量得文件名。
(向量得内积公式如图)
答案:ifstream inf1(s1,ios::in);
ifstream inf2(s2,ios::in);
double m, n;
double s=0;
while(inf1>>m && inf2>>n)
s+=m*n;
inf1、close;
inf2、close;
return s;
第14题 (10、0分) 题号:623
题目:试编写一个判断6位密码就是否正确得函数codec,
若密码正确返回1,密码不正确返回0,出现错误返回1。
密码规则就是:第i位数字就是第i1位数字加1后得3次方得个位数(2<=i<=6)。
比如:密码272727中第2位得'7'就是第1位得'2'加1后得3次方得个位数
((2+1)得3次方为27,其个位数为7),第3位得'2'就是第2位得'7'加1后得3次方
得个位数((7+1)得3次方为512,其个位数为2),以此类推。
答案: if (result != 1)
for (i=1; i<6; i++)
if (a[i]!=((a[i1]+1)*(a[i1]+1)*(a[i1]+1))%10) result =0;
第15题 (10、0分) 题号:616
题目: 请编写函数
int num_of_facs(int n);
计算一个正整数 n 得因子个数(包括1与自身)。
答案:
int m =0;
for(int i=1;i<n;i++)
if(!(n%i))
m++;
m++;
return m;
第16题 (10、0分) 题号:634
题目:马克思手稿中得数学题
马克思手稿中有一道趣味数学问题:有30个人,其中可能有男
人、女人与小孩,准备在一家饭馆花50先令吃饭;规定每个男
人可花3先令,每个女人可花2先令,每个小孩可花1先令;
问:男人、女人与小孩可各有几人?
要求将求出得每一组解以及解得总个数都通过调用output函
数写入文件f2、txt中。例如0、20、10就是一组解,则应使用
output(0);output(20);output(10)三条语句将这组解写入结果
文件f2、txt
答案:
for(m=0;m<=10;m++)
{
f=202*m;
c=30mf;
if(3*m+2*f+c==50)
{
cout<<m<<' '<<f<<' '<<c<<' '<<endl;
output(m);
output(f);
output(c);
num++;
}
}
第17题 (10、0分) 题号:263
题目: 已知n,计算n以内得所有素数之与sum。
提醒:在写程序时,可自己输入n。但就是最终提交时,请
从给定得文件读入n,即不要修改不允许修改得代码。
答案: for(outerindex=2; outerindex<n; outerindex++)
{
prime=true;
temp = (int) sqrt((float)outerindex);
for(innerindex=2; innerindex<=temp; innerindex++)
if(outerindex%innerindex==0)
{
prime = false;
break;
}
if(prime)
{
sum+=outerindex;
}
}
第18题 (10、0分) 题号:722
题目:编写函数countWeek,根据给定得星期数(其中星
期日用0表示、星期一用1表示、、、、、、、,以此类推
),请计算n天后就是星期几,并将结果返回。
答案: return (week + n)%7;
第19题 (10、0分) 题号:266
题目: 已知100个数求最大值及最小值以及它们得差。例如
8,43,7,18,2,56,37,123,25,26则
max=132,min=2,ca=130。
答案: max=min=a[0];
for(i=0;i<10;i++)
{if(a[i]>max)max=a[i];
if(a[i]<min)min=a[i];}
ca=maxmin;
第20题 (10、0分) 题号:680
题目:某个公司采用公用电话传递数据,
数据就是四位得整数,在传递过程中就是加密得,
加密规则如下:每位数字都加上5,
然后用与除以10得余数代替该数字,
再将第一位与第四位交换,
第二位与第三位交换 。
写一个函数实现这个算法,
函数原型就是 int changeinfo(int info)
答案:int changeinfo(int info)
{
int a[4];
a[0]=info%10;
a[1]=info%100/10;
a[2]=info%1000/100;
a[3]=info/1000;
for(int i=0;i<=3;i++)
{ a[i]+=5;a[i]%=10;}
for( i=0;i<=3/2;i++)
{
int t=a[i];
a[i]=a[3i];
a[3i]=t;
}
return a[0]+a[1]*10+a[2]*100+a[3]*1000;
}
第21题 (10、0分) 题号:588
题目: 定义函数mymult(int m),已知一个正整数m,求m得各位数字之积 f 。
答案:
void mymult(int m)
{
while( m!=0)
{n=m%10;f*=n;m=m/10;}
}
第22题 (10、0分) 题号:717
//自建题库第161题 题号:717
题目:从文件in中读入20个整数,将其中为
奇数得整数输出到显示器与文件out161、txt中,
每个奇数占一行。
答案: if (num%2)
{
cout<<num<<endl;
第23题 (10、0分) 题号:594
题目: 利用冒泡法将200个数按降序排列
答案:
for(i=0;i<200;i++)
{
for(j=0;j<200;j++)
{
if(arr[j+1]>arr[j])
{
k=arr[j+1];
arr[j+1]=arr[j];
arr[j]=k;
}
}
}
第24题 (10、0分) 题号:622
题目: 已知某文本文件 in、txt 中存放有若干整数,请将其按照
从小到大得顺序排列后存入另一文件 out、dat。
您需要完成三个函数
1、 void read_in (node* & p_head, char* s_file)
负责从某个文件 s_file 中读入,并存在以 p_head
为头部指针得链表中;
2、 void sort(node* p_head)
将链表内得元素按照从小到大得顺序排序;
3、 void write_out(node* p_head, char* s_file)
将链表中得元素依次写入到 s_file 中
(注意,写入得元素以回车分割)。
其中,链表节点结构 node 已经定义。
答案:void read_in(node* & p_head, char* s_file)
{
node * p_tail = p_head;
ifstream inf(s_);
int m;
while(inf>>m)
{
node * p_new = new node;
p_new>data =m;
p_new>next = NULL;
if(!p_head || !p_tail)
{
p_tail = p_head = p_new;
}
else
{
p_tail>next = p_new;
p_tail=p_new;
}
}
inf、close;
}
void sort(node* p_head)
{
for(node * p_i = p_head;
p_i;p_i=p_i>next)
{
node* p_k= p_i;
for(node* p_j=p_i;p_j;p_j=p_j>next)
if(p_j>data < p_k>data)
p_k=p_j;
int x = p_i>data;
p_i>data = p_k>data;
p_k>data = x;
}
}
void write_out(node* p_head, char* s_file)
{
ofstream ouf(s_);
for(node * p_cur = p_head; p_cur; p_cur=p_cur>next)
{
ouf<<p_cur>data<<endl;
}
ouf、close;
}
第25题 (10、0分) 题号:632
题目:打鱼还就是晒网
中国有句俗语叫"三天打鱼两天晒网"。某人从1990年1月1日起开始"三天打鱼两天晒网",
问这个人在以后得某一天中就是"打鱼"还就是"晒网"。
答案:
for(year=1990;year<today、year; year++)
{
term、year=year;
yearday+=days(term);
}
yearday+=days(today);
第26题 (10、0分) 题号:582
题目:在包含10个数得一维整数数组a中查找给定得数据num。
如果找到则返回1,未找到返回 0 、
答案: for (int i=0; i<10; i++)
if (a[i]==num)
return 1;
return 0;
第27题 (10、0分) 题号:679
题目:写一个函数char myfun(int score),
实现百分制成绩与等级之间得转换关系:
90分以上为"A",8089为"B",依次类推,
60分以下为"E",并将等级返回
答案:char myfun(int score)
{
switch(score/10)
{
case 10:case 9:return 'A';
case 8:
return 'B';
case 7:
return 'C';
case 6:return 'D';
default:
return 'E';
}
}
第28题 (10、0分) 题号:598
题目: 从文件中读入6个数到数组中,计算其中正数得平均值aver、
答案:
aver=0;
for(j=0;j<6;j++)
{
if(a[j]>0)
{
n++;
aver+=a[j];
}
}
aver/=n;
第29题 (10、0分) 题号:702
题目:编写一个函数void changeString(char str[]);,
功能就是把其中得大写字母变成小写字母,小写字母变成大写字母,
非字母得字符不作变换。变换结果依旧保存在str数组内。
大写字母得ASCII码值比对应得小写字母得ASCII码值小32,
如'A'得ASCII码值比'a'得ASCII码值小32。
答案:void changeString(char str[])
{
for(int i=0; str[i] != '\0'; i++)
{
if(str[i]>='a' && str[i]<='z')
str[i] = 32;
else if(str[i]>='A' && str[i]<='Z')
str[i] += 32;
}
}
第30题 (10、0分) 题号:657
题目:写一个函数,计算x得n次方。
函数原型就是double myfun(int x,int n)
答案: int x1=1;
while(n>0)
{
x1=x1*x;
n;
}
return x1;
第31题 (10、0分) 题号:645
题目:下面程序中得函数void conv(char *s);将字符串s中
得所有字符逆序存放,例如s中为”abc”时,调用该函数后
s中得字符串变为”cba”,完成该函数。
答案: int len = strlen(s), j;
for (j=0;j<len/2;j++)
{
char c = s[j];
s[j] = s[len1j];
s[len1j] = c;
}
第32题 (10、0分) 题号:590
题目: 计算11,000,000之间所有对称数得个数。
例如1221,2332都就是对称数。
答案:
int a,b,c,d;
a=i/1000;
b=i%1000/100;
c=i%100/10;
d=i%10;
if(a==d&&c==b)
{
cout<<i<<" ";
n++;
}
第33题 (10、0分) 题号:670
题目:函数myStrLen(char *a)返回字符串a得长度。填写
适当得代码,使得myStrLen完成正确得功能。
答案: int i=0;
while(str[i])
i++;
return i;
第34题 (10、0分) 题号:644
题目:下面得程序计算一个4*5得浮点数组s中每列得平均值,
并将结果存入到数组ave中,如第0列得平均值存入到ave[0]中。
完成该程序。
答案: for (j=0;j<5;j++)
{
float m=0;
for (i=0;i<4;i++)
m+=s[i][j];
m = m/4;
ave[j] = m;
}
第35题 (10、0分) 题号:177
题目:某服装店经营套服,也单件出售。若买得不少于50套,
每套80元;若不足50套,则每套90元;单件上衣
,每件60元;单条裤子,每条45元。
已知要买得上衣与裤子数,编写函数计算应付款。
函数原型就是 int Payfor(int yifu,int kuzi);
第一个参数表示衣服得数量,第二个参数表示裤子得数量
答案:int Payfor(int yifu,int kuzi)
{
int tao=0;
int pay=0;
if (yifu<=kuzi)
{
tao=yifu;
kuzi=yifu;
pay=45*kuzi;
}else
{
tao=kuzi;
yifu=kuzi;
pay=60*yifu;
}
if(tao>=50)
pay+=tao*80;
else
pay+=tao*90;
return pay;
}
第36题 (10、0分) 题号:659
题目:一个首项大于0得递增等差数列前四项与为26,前四项积为880,
写一个函数myfun返回该数列得第20项得值。
提示:如果一个数列从第二项起,每一项与它得前一项得差等于同一个常数,
这个数列就叫做等差数列,这个常数叫做等差数列得公差。
如等差数列:1,3,5,7,9,11。公差就是2,该数列得第5项值就是9
答案:int myfun
{
int a,b,c,d,flag;
for(flag=1,a=0; flag && a<5;++a)
for(d=1;flag && d<5;++d)
{
b=a+(a+d)+(a+2*d)+(a+3*d);
c=a*(a+d) *(a+2*d)*(a+3*d);
if(b==26&&c==880)
{
return a+19*d;
}
}
return 1;
}
第37题 (10、0分) 题号:688
题目:编写一个递归函数,计算下面得级数:
m(k) = 1 + 1/2 +1/3 +… + 1/k (k>=1)。
答案: double result = 0、0;
if (k==1) result = 1;
else result = 1、0/k + m(k1);
return result;
第38题 (10、0分) 题号:637
题目:约瑟夫问题
这就是17世纪得法国数学家加斯帕在《数目得游戏问题》中讲得一个故事:15个教徒与15 个
非教徒在深海上遇险,必须将一半得人投入海中,其余得人才能幸免于难,于就是想了一个
办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将她扔入大海,
如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海得都就是非教徒。
答案:
int i,j,k;
j=30; /*j:指向已经处理完毕得数组元素,从link[i]指向得人开始计数*/
for(i=0;i<15;i++) /*i:已扔下海得人数计数器*/
{
for(k=0;;) /*k:决定哪个人被扔下海得计数器*/
if(k<9)
{
j=link[j]、nextp; /*修改指针,取下一个人*/
k+=link[j]、no_out; /*进行计数。因已扔下海得人计标记为0*/
}
else break; /*计数到15则停止计数*/
link[j]、no_out=0; /*将标记置 0,表示该人已被扔下海*/
}
第39题 (10、0分) 题号:636
题目:求200000以内得自守数。
要求编写函数selfhold,判断一个数就是否就是一个自守数,
若就是,则返回1,否则返回0。
自守数就是指一个数得平方得尾数等于该数自身得自然数。例如:
25*25=625 76*76=5776 9376*9376=87909376
答案:
long mul,k,ll,kk;
for(mul=number,k=1;(mul/=10)>0;k*=10);
kk=k*10;
mul=0;
ll=10;
while(k>0)
{
mul=(mul+(number%(k*10))*(number%llnumber%(ll/10)))%kk;
k/=10;
ll*=10;
}
if(number==mul)
return 1;
else return 0;
第40题 (10、0分) 题号:8
题目:编程计算个人所得税。
个人所得税率表如下:月收入1200元起征,超过起征点500元以内部分税率5%,超过500
元到2,000元部分税率10%,超过2,000元到5,000元部分税率15%,超过5,000元到20,000
元部分税率20%,超过20,000元到40,000元部分税率25%,超过40,000元到60,000元部分
税率30%,超过60,000元到80,000元部分税率35%,超过80,000元到100,000元部分税率40%,
超过100,000元部分税率45%。
说明:1、应该从最高税率段开始计算,分段叠加。先算两万元以上各段,每两万为一档,采用
switch语句,注意没有使用break语句。后面各低收入段,用if语句,也没有使用else,
这两种方法就是对应得。
2、要注意计算得入口处,收入减去该段得下限,进行计算,以后各段都就是完整得段,
计算十分简单。
3、变量定义为双精度。
答案: double ine,tax=0;
int k;
cout<<"请输入个人月收入:"<<endl;
cin>>ine;
if(ine<=1200){
cout<<"免征个人所得税"<<endl;
return 0;
}
else ine=1200;
if(ine>20000){
k=ine/20000;
switch(k){
default: tax+=(ine100000)*0、45;ine=100000;
case 4: tax+=(ine80000)*0、40;ine=80000;
case 3: tax+=(ine60000)*0、35;ine=60000;
case 2: tax+=(ine40000)*0、30;ine=40000;
case 1: tax+=(ine20000)*0、25;ine=20000;
}
}
if(ine>5000){
tax+=(ine5000)*0、20;
ine=5000;
}
if(ine>2000){
tax+=(ine2000)*0、15;
ine=2000;
}
if(ine>500){
tax+=(ine500)*0、10;
ine=500;
}
tax+=ine*0、05;
cout<<"应征所得税:"<<tax<<endl;
return 0;
第41题 (10、0分) 题号:712
题目:分别输入一个整数、一个浮点数、一个字符、一个
字符串,将它们写入一个新建得文件中(用换行符
分隔),并将它们从该文件中读出并显示。
答案:ofstream out);
if(out)
{
cout<<"Open !"<<endl;
return;
}
outfile<<i<<" "<<f<<" "<<ch<<" "<<string<<" ";
out;
ifstream in);
if(in)
{
cout<<"Open !"<<endl;
return;
}
infile>>i>>f>>ch>>string;
cout<<i<<" "<<f<<" "<<ch<<" "<<string<<endl;
in;
第42题 (10、0分) 题号:641
题目:求三个数得平均值。函数float ave(int a, int b, int c);
计算3个数得平均值,完成该函数得编写。
答案: float m = (a+b+c)/3、0;
return m;
第43题 (10、0分) 题号:703
题目:编写函数int calLineNumber(char * ),
功能就是求文本文件内文本得行数(等于在记事本程序内瞧到得行数),
文本文件得名字由参数传入,假定一行得字符数不会超过100。
以下给出可能用到得函数得说明:
1、 int ifstream::eof 判别文件位置指针就是否到达文件结尾
2、 ifstream::getline(char *buffer, int count)
从文件最多读取count个字符存入buffer指向得内存区域,
如果遇到换行符,则读操作会提前结束。读入得内容尾部自动补上空字符。
答案:int calLineNumber(char * )
{
ifstream in, ios::in | ios::nocreate);
if(!inFile)
{
cerr<<"无法打开数据文件"<<<<"。需要核查!"<<endl;
return 0;
}
int lineCnt = 0;
while(!in)
{
char str[100];
in(str, 100);
//cout<<str<<endl;
lineCnt++;
}
in;
return lineCnt;
}
第44题 (10、0分) 题号:214
题目: 判断一个数23437就是否就是素数(要求程序中设置一
个参数flag,flag为1代表就是素数,为0代表不就是)
答案:
for(n=2;n<=m/2&&flag;n++)
if(m%n==0)flag=0;
cout<<flag<<endl;
第45题 (10、0分) 题号:629
题目:求最大数
问555555得约数中最大得三位数就是多少?
答案:
for(i=999;i>=100;i)
if(n%i==0)
{
break;
}
第46题 (10、0分) 题号:726
题目: 求一个正整数得所有因子。例如,24得因子就是1、2、3、4、6、8与12。
给定正整数s,将因子按升序存入数组factor中
答案: for(int j=1;j<=s/2;j++)
{
if(s%j==0)
{
factor[count]=j;
count++;
}
}
第47题 (10、0分) 题号:625
题目: 编写一个函数
int day_of_month(int year, i
展开阅读全文