QJ系列笔记
1.求int型数据在内存中存储时1的个数
输入一个int型数据,计算出该int型数据在内存中存储时1的个数。
#include<stdio.h> void main() { int in,cnt=0; int yu,mo; scanf("%d",&in); for(yu=in/2,mo=in%2;yu!=0;in=yu,yu=in/2,mo=in%2) { cnt=cnt+mo; } cnt=cnt+mo; printf("%d",cnt); }
方法二: /* * 原理:若n最右边的1在第k个位置,那么n-1之后,第k个位置的数由1变0,k之后的由0变1,k之前的不变。 * 再把n-1和n求& ,会把该整数最右边的1变为0。因此有多少个1,就循环几次。 */ #include<stdio.h> void main() { int a,cnt=0; scanf("%d",&a); while(a!=0) { a=a&(a-1); cnt++; } printf("%d",cnt); }
2.句子逆序
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
#include<stdio.h> void main() { int loop; char ch[100]; gets(ch); for(loop=99;loop>=0;loop--) { if((ch[loop]>='A'&&ch[loop]<='z')||ch[loop]==' ') printf("%c",ch[loop]); } }
3.字符串反转
写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。
#include<stdio.h> void main() { int loop,max=0; char ch[100]; gets(ch); max=strlen(ch); for(loop=max-1;loop>=0;loop--) { printf("%c",ch[loop]); } }
4.数字颠倒
描述:
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
#include<stdio.h> void main() { int loop,max=0; char ch[100]; gets(ch); max=strlen(ch); for(loop=max-1;loop>=0;loop--) { printf("%c",ch[loop]); } }
5.字符个数统计
编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。
#include<stdio.h>
void main()
{
int loop,max=0;
int cnt=0;
char ch[100];
gets(ch);
max=strlen(ch);
for(loop=max-1;loop>=0;loop--)
if(ch[loop]>=0 &&ch[loop]<=127)
cnt=cnt+1;
printf("%d",cnt);
}
6.提取不重复的整数
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
#include<stdio.h> void main() { char ch[100]; char ch2[10]; int max; int loop; int flag=0; gets(ch); max=strlen(ch); for(loop=max-1;loop>=0;loop--) { if(ch2[ch[loop]]!=1) { ch2[ch[loop]]=1; if(flag==0&&ch[loop]!='0')flag=1; if(flag==1) printf("%c",ch[loop]); } } }
7.合并表记录
数据表记录包含表索引和数值。请对表索引相同的记录进行合并,合并后表记录为相同索引表的数值求和
#include<stdio.h> void main() { int num,loop,pos,tmp; int a[100]={0}; int b[100]={0}; scanf("%d",&num); for(loop=0;loop<num;loop++) { scanf("%d",&pos); scanf("%d",&tmp); a[pos]=a[pos]+tmp; b[pos]=1; } for(loop=0;loop<99;loop++) { if(b[loop]==1) { printf("%d\n",loop); printf("%d\n",a[loop]); } } }
8.取近似值
写出一个程序,接受一个浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。
#include<stdio.h> void main() { float in; int cnt=0; scanf("%f",&in); for(;in>1.0;in=in-1)cnt=cnt+1; if(in>=0.5)cnt=cnt+1; printf("%d",cnt); }
9.质数因子
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
#include<stdio.h>
int check(int in)
{
int loop;
if(in==2) return 1;
for(loop=2;loop<in;loop++)
{
if(in%loop==0)return 0;
else
if(in%loop!=0&&loop==in-1)
{
return 1;
}
}
}
void process(int in)
{
int i,reslut=0;
reslut=check(in);
if(reslut==1)printf("%d",in);
else
for(i=2;i<in;i++)
{
reslut=check(i);
if(reslut==1)
{
if(in%i==0)
{
printf("%d ",i);
process(in/i);
break;
}
}
}
}
void main()
{
int in;
scanf("%d",&in);
process(in);
}
10.进制转换
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串
#include<stdio.h> int change(char ch) { int a; switch(ch){ case 'A': case 'a': a=10; break; case 'B': case 'b': a=11; break; case 'C': case 'c': a=12; break; case 'D': case 'd': a=13; break; case 'E': case 'e': a=14; break; case 'F': case 'f': a=15; break; case '9': a=9; break; case '8': a=8; break; case '7': a=7; break; case '6': a=6; break; case '5': a=5; break; case '4': a=4; break; case '3': a=3; break; case '2': a=2; break; case '1': a=1; break; case '0': a=0; break; default: a=0; printf("error input"); } return a; } void main() { char ch[100]; int len,i,sum=0,tmp; gets(ch); len=strlen(ch); for(i=2;i<len;i++) { tmp=change(ch[i]); sum=sum*16+tmp; } printf("%d",sum); }
11.字符串分隔
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
#include<stdio.h> process(char ch[],int len) { int j; int loop,cnt=0; j=len%8; for(loop=0;loop<len;loop++) { if(loop%8==0&&loop>0) { cnt=cnt+1; printf("\n"); } printf("%c",ch[loop]); } if(j>0) { for(loop=0;loop<8-j;loop++) { printf("0"); } printf("\n"); } } void main() { char ch1[100]; char ch2[100]; int len1,len2; int loop; gets(ch1); gets(ch2); len1=strlen(ch1); len2=strlen(ch2); process(ch1,len1); process(ch2,len2); }
12.明明的随机数
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
#include<stdio.h> void main() { int num,i,j,t=0; int min; int in[1000],tmp[1000],a[1000]; scanf("%d",&num); for(i=0;i<num;i++) { scanf("%d",&in[i]); } for(i=0;i<num-1;i++) { for(j=i+1;j<num;j++) { if(in[i]==in[j])break; } if(j==(num)) { tmp[t]=in[i]; t=t+1; } } tmp[t]=in[num-1]; t=t+1; for(i=0;i<t-1;i++) { for(j=i+1;j<t;j++) { if(tmp[i]>tmp[j]) { min=tmp[j]; tmp[j]=tmp[i]; tmp[i]=min; } } } for(i=0;i<t;i++) { printf("%d\n",tmp[i]); } }
13.计算字符个数
写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写
#include<stdio.h> void main() { char ch[100]; int i,len,num=0; char c; gets(ch); scanf("%c",&c); len=strlen(ch); for(i=0;i<len;i++) { if(ch[i]==c) { num=num+1; } else if(c>='a'&&c<='z') { if(c-ch[i]==32) num++; } else if(c>='A'&&c<='Z') { if(ch[i]-c==32) num++; } } printf("%d",num); }
14.求最小公倍数
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
#include<stdio.h> void main() { int a,b,i,begin; scanf("%d",&a); scanf("%d",&b); if(a>b)begin=a; else begin=b; for(i=begin;i%a!=0||i%b!=0;i++); printf("%d",i); }
15.求解立方根
•计算一个数字的立方根,不使用库函数
16.字符逆序
将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。 如:输入“I am a student”,输出“tneduts a ma I”。
上面有了
17.记负均正
从输入任意个整型数,统计其中的负数个数并求所有非负数的平均值(*任意个输入,注意方法!*)
#include<stdio.h>
void main()
{
int a;
int i=0,num=0,cnt=0,sum=0;
while(scanf("%d",&a)!=EOF)
{
if(a>=0)
{
sum=sum+a;
num=num+1;
}
else cnt++;
i++;
}
printf("%d\n",cnt);
if(sum==0)
printf("0.0");
else
printf("%d",sum/num);
}
18.字符串分割
连续输入字符串(输出次数为N,字符串长度小于100),请按长度为8拆分每个字符串后输出到新的字符串数组,
长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
上面有了
19.字符统计(*ASICC 码表的顺序要记住*)
如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。
20.输入整型数组和排序标识,对其元素按照升序或降序进行排序
输入整型数组和排序标识,对其元素按照升序或降序进行排序(*未完成*)
#include<stdio.h> void deseed(char ch[]) { int i,j,len,tmp; len=strlen(ch); for(i=0;i<len-1;i++) { for(j=i+1;j<len;j++) { if(ch[i]>ch[j]) { tmp=ch[j]; ch[j]=ch[i]; ch[i]=tmp; } } } for(i=0;i<len-1;i++) { printf("a=%d ",ch[i]); } printf("b=%d",ch[len-1]); } void reseed(char ch[]) { int i,j,len,tmp; len=strlen(ch); for(i=0;i<len-1;i++) { for(j=i+1;j<len;j++) { if(ch[i]<ch[j]) { tmp=ch[j]; ch[j]=ch[i]; ch[i]=tmp; } } } for(i=0;i<len-1;i++) { printf("c=%d ",ch[i]); } printf("d=%d",ch[len-1]); } void main() { char ch[100]; int flag,num,loop; scanf("%d",&num); for(loop=0;loop<num;loop++) { scanf("%c",&ch[loop]); printf("ch[loop]=%c",ch[loop]); } scanf("%d",&flag); if(flag=0) deseed(ch); else reseed(ch); }
21.等差数列
功能:等差数列 2,5,8,11,14。。。。
输入:正整数N >0
输出:求等差数列前N项和
返回:转换成功返回 0 ,非法输入与异常返回-1
#include<stdio.h> int main() { int n; scanf("%d",&n); if(n<=0) return -1; else { printf("%d",2*n+n*(n-1)*3/2); return 0; } }
22.自守数
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:252 = 625,762 = 5776,93762 = 87909376。请求出n以内的自守数的个数
#include<stdio.h> int check(int i) { int num=1; if(i<10) return num; else for(;i/10!=0;i=i/10) { num++; } return num; } int qiumi(int n,int len) { int i,a=1; for(i=0;i<len;i++) { a=a*10; } return a; } void main() { int scale,i,sq,len,cnt=0; scanf("%d",&scale); for(i=0;i<=scale;i++) { sq=i*i; len=check(i); if(0==(sq-i)%qiumi(10,len)) { cnt++; } } printf("%d",cnt); }
23.记负均正
首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值。
上面17题
24.表示数字
将一个字符中所有出现的数字前后加上符号“*”,其他字符保持不变
#include<stdio.h> void insertafter(char ch[],int i) { int len,loop; len=strlen(ch); for(loop=len+1;loop>i+1;loop--) { ch[loop]=ch[loop-1]; } ch[i+1]='*'; } void insertbefore(char ch[],int i) { int len,loop; len=strlen(ch); for(loop=len+1;loop>=i+1;loop--) { ch[loop]=ch[loop-1]; } ch[i]='*'; } int insertSym(char ch[],int i) { int re=0; if(i==0||ch[i-1]<='0'||ch[i-1]>='9') { insertbefore(ch,i); re++; if(ch[i+2]<='0'||ch[i+2]>='9') { insertafter(ch,i+1); re++; } } else if(ch[i+1]<='0'||ch[i+1]>='9') { insertafter(ch,i); re++; } return re; } void main() { char ch[100]; int i,leng; scanf("%s",&ch); for(i=0;ch[i]!='\0';i++) { if(ch[i]>='0'&&ch[i]<='9') { i=i+insertSym(ch,i); } } leng=strlen(ch); for(i=0;i<leng;i++) { printf("%c",ch[i]); } }
25.记票统计
请实现接口:
unsigned int AddCandidate (char* pCandidateName);
功能:设置候选人姓名
输入: char* pCandidateName 候选人姓名
输出:无
返回:输入值非法返回0,已经添加过返回0 ,添加成功返回1
Void Vote(char* pCandidateName);
功能:投票
输入: char* pCandidateName 候选人姓名
输出:无
返回:无
null
26.在字符串中找出连续最长的数字串
样例输出
输出123058789,函数返回值9
输出54761,函数返回值5
#include<stdio.h> int check(char ch[],int i) { int num=i; if(ch[i+1]>='0'&&ch[i]<='9') { num=i+1; check(ch,num); } else { return num; } } void main() { char ch[100]; int min=0,max=0,i,len; int tmpi,tmpj; scanf("%s",&ch); len=strlen(ch); for(i=0;i<len;i++) { if(ch[i]>='0'&&ch[i]<='9') { tmpi=i; tmpj=check(ch,i); i=tmpj; if((tmpj-tmpi)>(max-min)) { min=tmpi; max=tmpj; } } } for(i=min;i<=max;i++) { printf("%c",ch[i]); } }
27.201301 JAVA 题目2-3级
请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
不会
28.合法IP
现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
现在需要你用程序来判断IP是否合法。
#include<stdio.h> void main() { char ch[100]; int ch2[100]; int len,i,j=0; int num=0; scanf("%s",&ch); len=strlen(ch); for(i=0;i<len;i++) { if(ch[i]=='.') { ch2[j]=i; j++; } } if(3!=j) printf("NO"); else { for(i=0;i<ch2[0];i++) { num=(ch[i]-48)+num*10; } if(num<0||num>255) printf("NO"); else { num=0; for(i=ch2[0]+1;i<ch2[1];i++) { num=(ch[i]-48)+num*10; } if(num<0||num>255) printf("NO"); else { num=0; for(i=ch2[1]+1;i<ch2[2];i++) { num=(ch[i]-48)+num*10; } if(num<0||num>255) printf("NO"); else { num=0; for(i=ch2[2]+1;i<strlen(ch);i++) { num=(ch[i]-48)+num*10; } if(num<0||num>255) printf("NO"); else { printf("YES"); } } } } } }
29.密码强度等级
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
简单判断 太长不写了
30.求最大连续bit数
功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
跟前面那个在数字前后加*的一样,不在重复
31.字符串运用-密码截取
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
见上一篇博客
32.统计大写字母个数
找出给定字符串中大写字符(即’A'-’Z')的个数
接口说明
原型:int CalcCapital(String str);
返回值:int
跟上面重复,不再写
33.二维数组操作(不会)
有一个数据表格为二维数组(数组元素为int类型),行长度为ROW_LENGTH,列长度为COLUMN_LENGTH。对该表格中数据的操作可以在单个单元内,也可以对一个整行或整列进行操作,操作包括交换两个单元中的数据;插入某些行或列。
请编写程序,实现对表格的各种操作,并跟踪表格中数据在进行各种操作时,初始数据在表格中位置的变化轨迹。
NULL
34.字符串匹配
题目标题:
判断短字符串中的所有字符是否在长字符串中全部出现
#include<stdio.h> int check(char c,char ch[]) { int i,len; len=strlen(ch); for(i=0;i<len;i++) { if(ch[i]==c) return 1; } printf("fasle"); return 0; } void main() { char ch[100]; char ch1[100]; int len,len1; int i,j; int flag=0; gets(ch); gets(ch1); len=strlen(ch); len1=strlen(ch1); for(i=0;i<len;i++) { flag=check(ch[i],ch1)+flag; } if(len==flag) printf("true"); }
35.整形数组合并
题目标题:
将两个整型数组按照升序合并,并且过滤掉重复数组元素
基本是前面几个的重复,不再重复了
36.尼科彻斯定理(不会)
验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
NULL
37.公共字串计算 (*要注意*)
题目标题:
计算两个字符串的最大公共字串的长度,字符不区分大小写
#include<stdio.h> void change(char ch[]) { int i; for(i=0;i<strlen(ch);i++) { if(ch[i]>='A'&&ch[i]<='Z') ch[i]=ch[i]+32; } } void main() { char ch[100]; char ch1[100]; int i,j; int pos1,pos2,cnt; int max=0; gets(ch); gets(ch1); change(ch); change(ch1); for(i=0;i<strlen(ch);i++) for(j=0;j<strlen(ch1);j++) { cnt=0; pos1=i; pos2=j; while(ch[pos1]==ch1[pos2]&&pos1<strlen(ch)&&pos2<strlen(ch1))//while用法 以及判断是不是超出了数组的范围 { cnt++; pos1++; pos2++; } if(cnt>max) max=cnt; } printf("%d",max); }
38.参数解析(*要注意*)
在命令行输入如下命令:
xcopy /s c:\ d:\,
各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:\
参数4: 字符串d:\
请编写一个参数解析程序,实现将命令行各个参数解析出来。
解析规则:
1.参数分隔符为空格
2.对于用“”包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:\program files” “d:\”时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将“”去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入
#include<stdio.h> void main() { char ch[100]; int i,flag=0,len; gets(ch); len=strlen(ch); for(i=0;i<len;i++) { if(ch[i]!=' '&&ch[i]!='\"') printf("%c",ch[i]); else if(ch[i]=='\"') { flag=(flag+1)%2; } else if(ch[i]==' ') { if(flag==0) printf("\n"); } } }
39.计算日期到天数转换
根据输入的日期,计算是这一年的第几天。。
详细描述:
输入某年某月某日,判断这一天是这一年的第几天?。
错误代码:
#include<stdio.h> void main() { int flag=0,i,cnt=0,year,mon,day; int data[12]={31,28,31,30,31,30,31,31,30,31,30,31}; scanf("%d",year); scanf("%d",mon); scanf("%d",day); if((year%100==0&&year%400==0)||(year%100!=0&&year%4==0)) flag=1; if(1==flag) data[1]=29; for(i=0;i<mon-1;i++) { cnt=cnt+data[i]; } cnt=cnt+day; printf("%d",cnt); }
正确代码:
#include<stdio.h> void main() { int flag=0,i,cnt=0,year,mon,day; int data[12]={31,28,31,30,31,30,31,31,30,31,30,31}; scanf("%d",&year);/注意&不要忘了写 scanf("%d",&mon); scanf("%d",&day); if((year%100==0&&year%400==0)||(year%100!=0&&year%4==0)) flag=1; if(1==flag) data[1]=29; for(i=0;i<mon-1;i++) { cnt=cnt+data[i]; } cnt=cnt+day; printf("%d",cnt); }
40.百钱买百鸡问题 (*跟上面那个分解一样,尼科彻斯定理,注意方法*)
公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
41.成绩排序
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。