1、 要善于利用long long类型
2、 12345这种各个位上的数字都要利用的话可以朴素一点用数组存起来再用,%10和 /=10
3、 像有的既要存数又要存字符串可以利用结构体struct
4、 奇偶校验,输入字符,转换为ASCII码,再转换为二进制,数数几个1,偶数则为偶,第一位为0,反之为奇第一位为1,加判断转为二进制若是不够7位则前面补0,最后注意是倒序输出
int s = (int)a[i]; //转换为ASCII码
for(k=0;k<num;k++)
sum += b[k]; //看看有几个1
if(sum % 2 == 0) //偶数就是偶数输出第一位为1
printf("1");
5、 还是,像输入一串字符串,然后按照ASCII码由小到大的顺序输出,只需添加头文件string.h(为获取字符串长度strlen())然后直接冒泡排序,输出结果即可
6、
C语言的中gets(s) 和 scanf("%s",s) 的区别
二者都是从终端读入字符串。功能为
1、 gets功能为读入一行,并将换行符转换为字符串结束符。
2、 scanf("%s",s);读入时,遇到空白字符,包括空格,制表符,换行符时均会停止输入。
从功能上可以看出不同之处:
1 终止条件不同。gets只有遇到 \n时才会结束输入,而scanf遇到空格或制表符时,也会结束输入。
比如输入"test string\n"。
用gets得到的字符串为"test string",(即可以输入空格)
而用scanf得到的是"test"。(即不可输入空格)
7、
两个数找最大公约数:
while(scanf("%d %d",&m,&n)!=EOF){
int temp = n; //若是后者本身就是前者的约数,则就是后者本身
while(m % n !=0){
temp = m%n;
m = n;
n = temp;
}
printf("%d\n",temp);
}
(为什么第一步是temp=n呢,本来是要开始保证m小n大,这样就不用了,可以保证m大n小而且n为m约数时输出正确结果)
补充一个函数求,是递归
int gcd(int a, int b)//欧几里得算法求最大公约数
{
if(b==0) return a;
else return gcd(b, a%b);
}
8、 算一个数的次方的话是 pow(x,y) 表示x的y次方(math.h)
9、 输出一个字符串数组的逆序这样是可行的
就是注意i的边界,是实打实的0到m-1
while(scanf("%s",&a)!=EOF){
int m = strlen(a);
for(int i=m-1;i>=0;i--)
printf("%c",a[i]);
}
10、 一个求反码的题,这里所谓的反码是指:
若是小写字母,则a——z,c——x,这样。大写字母就是A——Z这样,其他如数字啊字符啥的不变。
这里转换的代码为:
if('a'<=a[i] && a[i]<='z')
a[i] = 'z' - a[i] + 'a';
else if('A'<=a[i] && a[i]<='Z')
a[i] = 'Z' - a[i] + 'A';
11、 减去’0’ 作用,就是得到数字,因为定义用的是char类型嘛,举个例子就是
’3’-‘0’ 样的话就得到了3这个数字本身这样
char n[1000];
while(gets(n)){
sum += (n[i] - '0');
}
而减去’a’ 则是在于得到数字,举个例子,如下则得到的结果为1
int main(){
char n='b';
int c = n-'a';
printf("%d",c);
return 0;
}
12、 今年的第几天问题,涉及到闰年
怎么判断的呢,year%400==0或者year%4==0 && year%100!=0
直接加上每个月的天数,在最后判断是否为闰年并且所写月份是否在二月后,是否加1即可
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
while(scanf("%d%d%d",&y,&m,&d)!=EOF){
for(int i=1;i<m;i++){
d += month[i];
}
if(y%400 == 0 || (y%4==0 && y%100!=0))
if(m>2)
d += 1;
printf("%d\n",d);
}
return 0;
}
13、 c语言里定义结构体是这样的
typedef struct name{
char xxx[10];
int xxx;
...
}name;
要是根据输入的n开大小的话是这样
name na[n];
14、 atoi这个函数是把一个字符转换为数字(此条与上一条同为题目:查找学生信息)
本条的意义在于,前面定义结构体有一个学号,如果是按照int类型定义的话,输入时会有01,02这样的数据,输出时前面的0就会被吞掉,所以用char类型定义,这样在比较的时候就得用到atoi这个函数把这个char转化为数字,以此来判断。
15、 字符串问题:替换,就是这样,如果是a-y则替换为后一位即b-z,如果是z则替换为a,大写则一样用大写字母替换,就是gets(a),然后a[i]++ 即可实现效果,字符串操作,熟
char a[90];
while(gets(a)){
for(int i=0;i<strlen(a);i++){
if('a'<=a[i] && a[i]<='y')
a[i]++;
else if(a[i] == 'Z')
a[i] = 'A';
}
16、 最简真分数:分子<分母,且最大公约数(求法看第七条)为1(不可化简呗)
17、 求二叉树的公共父节点(最初的) 就如下这样
while(a!=b){
if(a>b)
a = a/2;
else
b = b/2;
}
printf("%d\n",a);
18、 求二叉树两个节点之间有几个节点这样
好比输入3和12,那么就是3、6、7、12一共四个数,就是子节点是父节点的二倍和二倍+1,递归算一下即可
void get(int m,int n){
if(m<=n)
result++;
else
return;
get(2*m,n);
get(2*m+1,n);
}
19、 一个数求反转,即12变成21这样
int reverse(int num){
int sum=0;
while(num){
sum= sum*10+num%10;
num/=10;
}
return sum;
}
20、 求素数
就是直接只判断2-根号下这个数即可
bool isprime(int n){
if(n<=1)
return false; /小于等于1,直接返回false
int sqr = (int)sqrt(1.0*n); /因为sqrt要求里面是浮点数运算,所以是乘以了1.0
for(int i=2;i<=sqr;i++){ /从2到根号n看是否有能整除的,有的话就不是素数
if(n%i==0)
return false;
}
return true;
}
int prime[101],pnum=0; /prime存素数,pnum存素数的个数
bool p[101] = {0}; /true表示是素数
void find_prime(){ /这个例子是求了100以内的素数
for(int i=1;i<101;i++){
if(isprime(i) == true){
prime[pnum++] = i;
p[i]=true;
}
}
}