1、整数求反
如123456求反之后变654321
思路:定义两个变量,一个变量保存原来的数,另外一个保存取反之后的数。然后利用对10求余的方法将要取反的数的最低位首先取出来,然后利用除法(除以10)将最低位去掉。利用num>0不断的循环一位一位的取出来即可。
关键:***对10求余是取出最低位***
***除以10是去除最低位***
int main(void)
{
int num = 123456;
int r_num = 0;
while(num > 0)
{
r_num = r_num*10 + (num%10);
num = num/10;
}
printf("%d\n", r_num);
}
2、字符串求反(逆序)
思路1:先算出字符串的长度,然后记录中间的位置,循环交换第一个字符和最后一个字符
思路2:函数接口设计成要char *ReverseString(char *s, int start, int end)
char *ReverseString(char *s)
{
if(s == NULL)
{
return s;
}
int len = strlen(s);
int i = 0;
char temp;
for(i=0; i<len/2; i++)
{
temp = s[i];
s[i] = s[len-1-i];
s[len-1-i] = temp;
}
return s;
}
char *ReverString(char *str, int start, int end)
{
if(str == NULL)
{
return str;
}
cahr temp;
while(start < end)
{
temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
start--;
}
return str;
}
3、递归求n的阶乘
思路:注意递归结束的条件即可
int recursion(int n)
{
if(n <= 0)
{
return 0;
}
else if(n == 1)
{
return 1;
}
else
{
n= n*recursion(n-1)
}
return n;
}
4、不用库函数比较两个字符串的大小
int strcmp(const char*src, const char *dst)
{
if(src==NULL || dst==NULL)
{
return -1;
}
while(*src && *dst && *src==*dst)
{
src++;
dst++;
}
return *src-*dst;
}
5、写一个程序读入一个文件判断文件中字母a的个数
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp = NULL;
char ch;
int count = 0;
//打开文件
fp = open("test.txt", "r");
if(fp == NULL)
{
printf("oepn error\n");
return -1;
}
//循环读取文件的字符
while((ch = fgetc(fp)) != EOF)
{
if(ch == 'a')
{
count++;
}
}
printf("%d\n", count);
//关闭文件
close(fp);
return 0;
}
6、求0--3000中含有9和2的全部数之和
思路:从29循环到3000,然后将每个数转换成字符串,写一个函数检测这个字符串有没有含有‘9’,‘2’的字符,如果含有则返回1
没有则返回0,如果成立则将此数叠加起来。
需要的函数:数字转字符串的函数char * myitoa(char *buf, int num, int radix)
char *myitoa(int num, char *str, int radix)
{
char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int temp;
int i = 0, j, k;
if(radix==10 && num<0)
{
temp = -num;
str[i++] = '-';
}
else
{
temp = num;
}
while(temp)
{
str[i++] = index[temp%radix];
temp = temp/radix;
}
str[i] = '\0';
/*转换*/
if(str[0] == '-')
k = 1;
else
k = 0;
char temp1;
for(j=k; j<=(i-k-1)/2; j++)
{
temp1 = str[j];
str[j] = str[i-j-1];
str[i-j-1] = temp;
}
return str;
}
#include <stdio.h>
char *myitoa(int num, char *str, int radix)
{
char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int temp;
int i = 0, j, k;
if(radix==10 && num<0)
{
temp = -num;
str[i++] = '-';
}
else
{
temp = num;
}
while(temp)
{
str[i++] = index[temp%radix];
temp = temp/radix;
}
str[i] = '\0';
/*
if(str[0] == '-')
k = 1;
else
k = 0;
char temp1;
for(j=k; j<=(i-k-1)/2; j++)
{
temp1 = str[j];
str[j] = str[i-j-1];
str[i-j-1] = temp;
}*/
return str;
}
void* mymemset(void *str, int val, unsigned int n)
{
if(str == NULL)
{
return;
}
void *temp = str;
while(n-->0)
{
*(char *)str = (char)val;
str = (char *)str + 1;
}
return temp;
}
int test29(const char *buf)
{
if(buf == NULL)
{
return -1;
}
int flag_2 = 0, flag_9 =0;
while(*buf != '\0')
{
if(*buf == '2')
{
flag_2 = 1;
}
if(*buf = '9')
{
flag_9 = 1;
}
buf++;
}
if(flag_2 && flag_9)
{
return 1;
}
return 0;
}
int main(void)
{
int sum = 0;
int num = 29;
char str[5];
mymemset(str, 0, 5);
for(num=29; num<=3000; num++)
{
//将数字转化成字符串
myitoa(num, str, 10);
if(test29(str))
{
sum = sum + num;
printf("%d\n", num);
}
}
printf("%d\n",sum);
}
7、十进制转化成任意进制
思路:十进制数X转化成M进制,方法:从X开始循环求余M,记下余数,X再除以M,再利用X除以M的商作为新的X继续求余M,知道X=0为止。然后倒序取余数即可。
void tans10_to_other(char *buf, int num, int radix)
{
if(buf == NULL)
{
return;
}
char r;
while(num > 0)
{
r = num % radix;
if(r > 10)
{
*buf = r + '0';
}
else
{
*buf = r + 'A';
}
num = num / radix;
buf++;
}
*buf = '\0';
}
8、判断一个数是否是2的n次方(==符号的优先级高于&)
int fun(int x)
{
return ((x&(x-1))==0)? 1 : 0;
}
9、统计一个数的1的个数
int CountOne(int x)
{
int count = 0;
while(x)
{
count++;
x &= (x-1);
}
return count;
}
10、判断机器的大小端
/*返回1:大端
*返回0:小端
*/
int Testendian(void)
{
union endian
{
unsigned int a;
unsigned char b;
}x;
x.a = 1;
return x.b==1? 0 : 1;
}
int TestEndian(void)
{
unsigned int a = 0x12345678;
char *p = (char*)&a;
return ((*p)==1)? 0 : 1;
}
9、typedef int(*CallBack)(char *p);
分析:
1、CallBack是变量名
2、*CallBack:CallBack是一个指针
3、int是函数返回值的类型char*p是函数参数的类型,所以这个函数指针指向一个类型为Int fun(char *)的函数
4、利用typedef令CallBack是这种类型的别名
/*声明一个函数指针*/
CallBack my_callback1;
10、字符串转化成整形数
int myatoi(const char *p)
{
if(p == NULL)
{
return 0;
}
int num = 0;
int Minus = 1;
if(*p == '-')
{
Minus = -1;
p++;
}
else
{
Minus = 1;
}
char *temp = p;
while(*temp>'9' || *temp<'0')
{
return 0;
}
while(*p != '\0')
{
num = num * 10 + *p - '0';
p++;
}
num *= Minus;
return num;
}
11、二分法查找
int binary(int *arry, int len, int goal)
{
int low = 0;
int high = len-1;
int middle;
while(low < high)
{
middle = low + (high-low)/2;
if(arry[middle] = goal)
{
return middle;
}
else if(arry[middle] > goal)
{
high = middle;
}
else
{
low = middle;
}
}
return -1;
}
12、将一个四位数的整数编码,编码方法:将每一位数都加上5,结果除10,所得余数取代该位数,最后第一个位和第四位交换,第二位和第三位交换。返回编码后的结果(int)。例如1234的编码结果返回9876.
思路:一般设计到数字的编程都要用到求余和除法。一个四位数对10求余可得到个位。对100求余可得到一百以下的那个数,然后除以10获得的商就可得十位。对1000求余得到1000一下的那个数,再除以100获得的商即是百位。要获得千位直接除以1000即可。然后利用一个数组存储起来每一位加上五,再求余十。
int Code(int num)
{
int a[4];
int i = 0;
int n = num;
int sum = 0;
for(i=0; i<4; i++)
{
a[i] = n%10;
n /= 10;
}
for(i=0; i<4; i++)
{
a[i] += 5;
a[i] %= 10;
sum = sum*10 + a[i];
}
return sum;
}
13、利用2、4、6、8四个数用加减乘除计算出23。(每个数字只能用一次)
4*(6-(2/8))