数字与字符串转换
- 使用itoa函数,注意要指定转换的进制..
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int number=12345;
char string[7]={0};
itoa(number,string,10);
printf("integer=%d\n",number);
printf("string=");
for(int i=0;i<6;i++)
printf("%c",string[i]);
printf("\n");
return 0;
}
- 用sprintf,sscanf来写入写出..
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int number=12345;
int temp;
char string[7]={0};
sprintf(string,"%d",number);
printf("string=");
for(int i=0;i<6;i++)
printf("%c",string[i]);
printf("\n");
sscanf(string,"%d",&temp);
printf("integer= %d\n",temp);
return 0;
}
1.蛇形填数
注意边界条件的判断
#include<stdio.h>
int a[100][100]={0};
int main()
{
int n,tot,x,y;
scanf("%d",&n);
x=0;y=n-1;
tot=a[x][y]=1;
while(tot<n*n)
{
while(x+1<n && !a[x+1][y]) a[++x][y]=++tot;
while(y-1>=0 && !a[x][y-1]) a[x][--y]=++tot;
while(x-1>=0 && !a[x-1][y]) a[--x][y]=++tot;
while(y+1<n && !a[x][y+1]) a[x][++y]=++tot;
}
for(x=0;x<n;x++)
{
for(y=0;y<n;y++)
printf("%3d",a[x][y]);
printf("\n");
}
return 0;
}
2.竖式乘法
查找数字是否出现过,可以用字符串操作strchr查找字符串中是否出现过字符c,即把数字转换成字符去与输入的字符串对比..
#include<stdio.h>
#include<string.h>
int main()
{
int abc,de,x,y,z,ok,i,count=0;
char s[100],buf[100]="";
scanf("%s",s);
for(abc=100;abc<=999;abc++)
for(de=10;de<=99;de++)
{
x = abc*(de%10); y = abc*(de/10); z = abc*de;
sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);
//把十进制的数字以char输出到字符数组中
ok=1;
for(i=0;i<strlen(buf);i++)
if(strchr(s,buf[i])==NULL) ok=0;//s中首次出现字符buf[i]的位置
if(ok)
{
printf("<%d>\n",++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
}
}
printf("The number of solutions = %d\n",count);
return 0;
}
3.最长的回文子串
遍历寻找子串,从左起开始循环检测
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char buf[5000],s[5000];
int main()
{
fgets(buf,sizeof(buf),stdin);
int n,m=0,ok=1,max=0;
int i,j,k;
n=strlen(buf);
for(i=0;i<n;i++)
if(isalpha(buf[i])) s[m++]=toupper(buf[i]);
for(i=0;i<m;i++)
for(j=i;j<m;j++)
{
ok=1;
for(k=i;k<=j;k++)
if(s[k]!=s[j-(k-i)])
ok=0;
if(ok && j-i+1>max) max=j-i+1;
}
printf("max = %d\n",max);
return 0;
}
从中间向两边扩展,从中间开始枚举,奇数偶数有区别注意区分,总的复杂度是o(m^2),比遍历要小,另外要原样输出必须存下字符的位置..
这里输入用的是fgets也可以用gets..
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char buf[5000],s[5000];
int main()
{
fgets(buf,sizeof(buf),stdin);
int n,m=0,ok=1,max=0;
int i,j,k,x,y,p[100]={0};
n=strlen(buf);
for(i=0;i<n;i++)
if(isalpha(buf[i])) {p[m]=i;s[m++]=toupper(buf[i]);}
for(i=0;i<m;i++)
{
for(j=0;i-j>=0 && i+j<m;j++)
{
if(s[i-j]!=s[i+j]) break;
if(j*2+1>max) {max=2*j+1;x=p[i-j];y=p[i+j];}
}
for(j=0;i-j>=0 && i+j+1<m;j++)
{
if(s[i-j]!=s[i+j+1]) break;
if(j*2+2>max) {max=2*j+2;x=p[i-j];y=p[i+j+1];}
}
}
for(i=x;i<=y;i++)
printf("%c",buf[i]);
printf("\n");
return 0;
}
4.统计单词的长度
输入一个gets的字符串,提取其中的字符
#include<stdio.h>
#include<string.h>
#include<ctype.h>
const int MAX=189819;
int main()
{
int count=1,sumLength=0;
char word[MAX];
gets(word);
int preIndex=0;
for(int i=0;i<strlen(word);i++)
{
if(word[i]==' ')
{
if(preIndex==0)
sumLength+= i;
count++;
sumLength += i-preIndex;
preIndex=i+1;
}
}
if(count ==0)
printf("No Input");
else
printf("%lf\n",(double)sumLength/count);
return 0;
}
5.计算器
从输入的一行字符串中提取数字,根据操作符来分隔左操作数和右操作数..先要转存到字符数组中,再换算成数字..
#include<stdio.h>
#include<string.h>
#include<ctype.h>
const int MAX=189819;
int main()
{
int x,y,i,power;
char str[MAX];
char strX[4]={0},strY[4]={0};
char opr;
gets(str);
int p=0;
for(i=0;str[i]!='+' && str[i]!='-' && str[i]!='*' && str[i]!='/';i++)
if(str[i]>='0' && str[i]<='9')
strX[p++]=str[i];
strX[p]='\0';
//printf("%s",strX);
opr=str[i];
//printf("%c",opr);
p=0;
while(i<strlen(str))
{
if(str[i]>='0' && str[i]<='9')
strY[p++]=str[i];
i++;
}
strY[p]='\0';
//printf("%s",strY);
x=0;power=1;
for(i=strlen(strX)-1;i>=0;i--)
{
x += (strX[i]-'0')*power;
power *= 10;
}
y=0;power=1;
for(i=strlen(strY)-1;i>=0;i--)
{
x += (strY[i]-'0')*power;
power *= 10;
}
if(opr == '+') printf("%d\n",x+y);
if(opr == '-') printf("%d\n",x-y);
if(opr == '*') printf("%d\n",x*y);
return 0;
}
6.进制转换
十进制转换成其他进制,就一直求余就行了,如果忘了,推一次二进制除法就可以写出来..
#include<stdio.h>
#include<string.h>
#include<ctype.h>
const int MAX=189819;
int main()
{
int n,b;
int ans[MAX]={0};
scanf("%d%d",&n,&b);
int i=0;
while(n)
{
ans[i++]=n%b;
n = n/b;
}
for(i=i-1;i>=0;i--)
printf("%d",ans[i]);
printf("\n");
return 0;
}
7.字符串转换
输入的字符串错位,可以用单个输入getchar来做。首先要输入的c在常量字符串当中的位置,其次要考虑空格的输出。
#include <stdio.h>
#include <math.h>
char *s="`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
int i,c;
while((c=getchar())!=EOF)
{
for(i=1;s[i]&&s[i]!=c;i++);
if(s[i]) putchar(s[i-1]);
else putchar(c);
}
return 0;
}
8.周期串的检验
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
char word[100];
scanf("%s",word);
int len = strlen(word);
for(int i=1;i<=len;i++)
if(len%i==0)
{
int ok=1;
for(int j=i;j<=len;j++)
if(word[j]!=word[j%i]) {ok=0;break;}
if(ok) {printf("%d\n",i);break;}
}
return 0;
}
华为的一道题
#include <stdio.h>
#include <stdlib.h>
int a[10];
void swap(int &a,int &b)
{
if(a!=b)
{
a ^=b;
b ^=a;
a ^=b;
}
}
void insert_sort(int a[],int n)
{
for(int i=1;i<n;i++)
for(int j=i-1;j>=0 && a[j]>a[j+1];j--)
swap(a[j],a[j+1]);
}
int remove_duplicate(int a[],int n)
{
int index=0;
for(int i=1;i<n;i++)
if(a[index]!=a[i])
a[++index]=a[i];
return index+1;
}
int main()
{
int i,n;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
insert_sort(a,10);
//for(i=0;i<10;i++)
//printf("%d ",a[i]);
n=remove_duplicate(a,10);
// for(i=0;i<n;i++)
// printf("%d ",a[i]);
for(i=n-1;i>=n-5;i--)
printf("%d",a[i]);
printf("\n");
}