算法笔记 3.数组字符串

阅读<算法竞赛入门>时,一些对重点知识点查资料进行注解, 和自己手作的题目. 

( 再有审核给出'内容非专业IT知识' 的情况, 建议把审核拉去恶补一下 )

P48

知识点:

!数组的声明、使用

!字符串声明、赋值、比较、连接

ASCII码和ctype.h中的字符函数

运算符++、+=

编译选项-Wall获得警告信息

!fgets、getchar使用

不同操作系统中换行符表示

fgets使用,gets“缓冲区溢出”漏洞

预处理、迭代开发技巧

目录

数组

数组的操作

字符数组

ASCII码表示字符

字符串读入:

字符串数组:

输出到字符串

字符串操作函数

-Wall编译选项

小结与习题

重新实现库函数

I/O的效率

使用bug注意-数组与字符串

在函数中接收参数定义int []与int*

Scanf返回条件

进制转换

缓冲区刷新:(清除输入时的垃圾)


数组

读入数组逆序输出

声明数组注意防止溢出

#define MAXN 100+10

int a[MAXN]

读入简洁:

while(scanf(“%d”,&x)==1)

    a[n++]=x;

输出注意n++为后+,则下标n处元素为空

for(i=n-1;i>=1;i--)

输出一般格式:

行首行尾无空格,相邻两数用单个空格隔开(只能分两种输出情况)

解决:下例first标记

数组过大时放在main函数外面(只有放在外面,才能开得很大)

 

例3.1开灯问题

#include<stdio.h>

int a[1010];

int main(){

         int n,k,i,j;

         scanf("%d%d",&n,&k);

         //我的赋初值

         for(i=1;i<=n;i++){

                  a[i]=0;

         }

         for(i=1;i<=k;i++){

                  for(j=i;j<=n;j+=i){ //关于倍数的思考

                          a[j]++;

                  }

         }

         for(i=1;i<=n;i++){

                  if(a[i]%2!=0)printf("%d ",i);

         }

         return 0;

}

改进:清零与边界空格问题

#include<stdio.h>

#include<string.h>

int a[1010];

int main(){

         int n,k,i,j,first=1;

         scanf("%d%d",&n,&k);

         //清零

         memset(a,0,sizeof(a));

         for(i=1;i<=k;i++){

                  for(j=i;j<=n;j+=i){

                          a[j]++;

                  }

         }

         for(i=1;i<=n;i++){

                  if(a[i]%2!=0){

                          if(first)first=0;

                          else printf(" ");

                          printf("%d",i);

                  }

         }

         return 0;

}

数组的操作

头文件String.h

代替循环清零memset(a,0,sizeof(a)); memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0-1之外的其他值(除非该值高字节和低字节相同)

数组赋值memcpy(b,a,sizeof(int)*k,)或如果数组double类型memcpy(b,a,sizeof(double)*k)

类比int b=a,如果要把数组a全部放入b,直接memcpy(b,a,sizeof(a))

例3.2蛇形填数

#include<stdio.h>

#include<string.h>

int a[10][10];

int main(){

         int n,i,j,num=1;

         scanf("%d",&n);

         for(i=n;i>0;i--){

                  for(j=n-i;j<i;j++){

                          a[j][i-1]=num;

                          num++;

                  }

                  for(j=i-1-1;j>=n-i;j--){

                          a[i-1][j]=num;

                          num++;

                  }

                  for(j=i-1-1;j>=n-i;j--){

                          a[j][n-i]=num;

                          num++;

                  }

                  for(j=n-i+1;j<i-1;j++){

                          a[n-i][j]=num;

                          num++;

                  }

         }

         for(i=0;i<n;i++){

                  for(j=0;j<n;j++){

                          printf("%d\t",a[i][j]);

                  }

                  printf("\n");

         }

         return 0;

}

改进:

  1. 赋值xy后马上作为下标
  2. 赋值可以连等
  3. 移动坐标利用while只判断越界
  4. 先预判下一步(是否越界)再对变量操作

#include<stdio.h>

#include<string.h>

int a[10][10];

int main(){

         int n,x,y,num=1;

         scanf("%d",&n);

         memset(a,0,sizeof(a));

         a[x=0][y=n-1]=num;

         while(num<n*n){

                  while(x+1<n&&!a[x+1][y])a[++x][y]=++num;

                  while(y-1>=0&&!a[x][y-1])a[x][--y]=++num;

                  while(x-1>=0&&!a[x-1][y])a[--x][y]=++num;

                  while(y+1<n&&!a[x][y+1])a[x][++y]=++num;

         }

         for(x=0;x<n;x++){

                  for(y=0;y<n;y++){

                          printf("%d\t",a[x][y]);

                  }

                  printf("\n");

         }

         return 0;

}

字符数组

其他进制数字读写

例3.3竖式问题

尝试所有的abc和de,判断是否满足

#include<stdio.h>

#include<string.h>

int a[10],b[5],c[13];

int main(){

         int i[4],j,k,flag=0,n=0,count=0,pro;

         while(scanf("%d",&a[n])==1)n++;

        

         for(i[0]=0;i[0]<n;i[0]++){

                  b[0]=a[i[0]];

                  for(i[1]=0;i[1]<n;i[1]++){

                          b[1]=a[i[1]];

                          for(i[2]=0;i[2]<n;i[2]++){

                                   b[2]=a[i[2]];

                                   for(i[3]=0;i[3]<n;i[3]++){

                                       b[3]=a[i[3]];

                                       for(i[4]=0;i[4]<n;i[4]++){

                                                b[4]=a[i[4]];

        

                                                pro=(b[0]*100+b[1]*10+b[2])*b[4];

                                                c[0]=pro/1000;

                                                c[1]=(pro/100)%10;

                                                c[2]=(pro/10)%10;

                                                c[3]=pro%10;

                                                pro=(b[0]*100+b[1]*10+b[2])*b[3];

                                                c[4]=pro/1000;

                                                c[5]=(pro/100)%10;

                                                c[6]=(pro/10)%10;

                                                c[7]=pro%10;

                                                pro=(b[0]*100+b[1]*10+b[2])*(b[3]*10+b[4]);

                                                c[8]=pro/10000;

                                                c[9]=(pro/1000)%10;

                                                c[10]=(pro/100)%10;

                                                c[11]=(pro/10)%10;

                                                c[12]=pro%10;

                                                for(j=0;j<13;j++){

                                                         flag=0;//

                                                         for(k=0;k<n;k++){

                                                                 if(c[j]==a[k]){

                                                                          flag=1;

//                                                                      printf("%d %d\t",j,a[k]);

                                                                          break;

                                                                      }

                                                             }

                                                             if(!flag)break;

                                                             else if(j==12){

                                                                      printf("<%d>\n  ",++count);

                                                                      for(k=0;k<3;k++){

                                                                               printf("%d",b[k]);

                                                                      }

                                                                      printf("\n");

                                                                      printf("x  ");

                                                                      for(k=3;k<5;k++){

                                                                               printf("%d",b[k]);

                                                                      }

                                                                      printf("\n");

                                                                      printf("-----");

                                                                      printf("\n");

                                                                      for(k=0;k<13;k++){

                                                                               printf("%d",c[k]);

                                                                       }

                                                                      printf("\n");

                                                             }

                                                     }

                                            }

                                   }

                          }

                  }

         }

         printf("The number of solution=%d",count);

         return 0;

}

改进:

 

#include<stdio.h>

#include<string.h>

 

int main(){

         int i,ok,abc,de,x,y,z,count=0;

         char s[20],buf[99];

         scanf("%s",s);

         for(abc=111;abc<=999;abc++)

             for(de=11;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);//数字转字符串

                          ok=1;

                          for(i=0;i<strlen(buf);i++){

                                   if(strchr(s,buf[i])==NULL)ok=0;//技巧,利用字符函数寻找整数

                          }

                          if(ok){

                                   printf("<%d>\n",++count);//输出时放在里面简洁

                                   printf("%5d\nx%4d\n-----\n%5d\n%4d\n-----\n%5d\n",abc,de,x,y,z);//%5d不足5位前补空格

                          }

                  }

         printf("number of solution=%d\n",count);

         return 0;

}

ASCII码表示字符

ASCII的0为NULL、\0结束符,整数0

Char是特殊的int(ASCII),转义有:’\n’,空字符’\0’,’\\’,’\’’

字符串读入:

char s[20];

scanf(“%s”,s);

读入字符串-不含空格、TAB、回车,使用时s前没有&取地址符

若有空格,可fgets(buf,sizeof(s),stdin);

技巧:在用%d读取整数后遗留换行符,下一次%c会读到,scanf%s可以跳过换行,空格结束:

scanf(“%s%d%d”,type,&X,&Y);

字符串数组:

读取字符串数组char s[MAXN][MAXL]的第i个字符串:

scanf(“%s”,s[i]);

输出到字符串

Sprintf输入到字符串

Sscanf从字符串提取

输出函数:printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串(需保证字符串有足够空间:字符个数+1,C语言的字符串以空字符’\0’结尾)

 

若一定要用fgets, 可

 

char buf[20];

fgets(buf, 20, stdin);

但是得到的是字符串.转为整数还需要

 

sscanf(buf, "%d", &n);

使用注意:输入前有多余空格没有关系,有与数据类型不同的输入会造成丢失(输出变成随机值)

字符串操作函数

字符串的本质是数组,因此赋值、比较、连接操作分别为:strcpy(a,b),strcmp(a,b),strcat(a,b)

需要使用头文件string.h

而不能使用=、==、<=、+

strlen(s)获取字符串实际长度:’\0’前的字符个数,不包括’\0’,但由于数组从0开始,s[strlen(s)]==’\0’

 

Strchr字符查找(上例)返回字符串中首次出现字符的地址,可用指针接收

技巧:可以把指向字符的指针看成字符串,从该位置开始,一直到’\0’

 

Strcmpstr1==str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。

 

头文件ctype.h

isalpha:大写或小写字母,

isdigit:十进制数字

isprint:可打印字符时,返回非零值,否则返回零。

toupper/tolower转换大小写

 

strlwr(char [])strupr()#include <string.h>只能在windows下使用,Linux GCC中需要自己定义

不会创建一个新字符串返回,而是改变原有字符串。所以strlwr()只能操作字符数组,而不能操作指针字符串

Strncpy: strcpy默认从头截取,参数是字符串数组的名字,而数组名本质上是指针,那么,src+3 就可以实现将 src中从第4个字符开始复制n个字符给 dest

char dest[4] = {""};

char src[] = {"123456789"};

strncpy(dest, src+3, 3);

puts(dest);

//结果456

 

注意++的使用:建议每条语句使用一次;++修改的变量,每条语句只出现一次

如:printf(“%d %d %d\n”, count++, count++,count++)输出结果:2 1 0

-Wall编译选项

 

例3.4最长回文子串

回文:正反看相同

在判断时忽略空格、符号、大小写,但输出保持原样

应输出最长的回文串,如果有多个,输出起始位置最靠左的

样例输入:Confuciuss say: Madam, I’m Adam.

样例输出:Madam, I’m Adam

分析:不能用scanf,因为它遇空格TAB停止。

解决输入中有空格:

法一:getchar、fgetc读取“下一个字符”

fgetc(fin)读取文件fin,读取一个字符,返回int值(因文件结束符EOF不是char),应当检查完不是EOF后转为char

可用getchar()从标准输入读

需要考虑非信息字符,尽量避免写出受操作系统影响的程序。

法二:读取完整一行

fgets :

buf[MAXN];//应保证能存下一行

fgets(buf,MAXN,fin);

读取不超过MAXN-1个字符,然后加上’\0’,因此不会越界。

fgets遇\n停止(’\n’是buf的最后一个有效字符,+结束\0)

除非文件最后不是\n结尾,则最后一行将在读到EOF结束,buf不以\n结尾

一个字符都没读到,返回NULL

gets读取标准输入:

gets(s)没有指明最大字符数,可能遗失,访问非法内存(缓冲区溢出漏洞)

fgets最方便。

解决判断忽略标点、空格、大小写,输出原样:

不能改动原字符串,如果每次判断时跳过太麻烦->构造关联字符串

预处理法简化输入:

isalpha(s)跳过标点、空格

toupper(s)返回大写(或用ch-‘a’+’A’)

头文件ctype.h

1.枚举子串起点终点,判断是否回文;

或法2.枚举子串中间点,往外扩展,直到有字符不同

长度为奇数和偶数的处理不同

for(i=0;i<m;i++)

    for(j=i;j<m;j++)

        for(k=i;i<=j;i++)

            if(s[k]!=s[i+j-k])//对称位置

                ok=0;

迭代开发:每次实现一部分功能,但要充分测试,保证正常

原样输出:

更新子串长度max时保存起点终点ij

增加数组p,预处理时p[i]保存s[i]在buf中的对应位置xy

最后输出buf[x]到buf[y]

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#define MAXN 5000+10

char buf[MAXN],s[MAXN];

int p[MAXN];

int main(){

         int n,m=0,max=0,x,y,i,j;

         fgets(buf,sizeof(s),stdin);

         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++){//j为到中心边界长度

                          if(s[i-j]!=s[i+j])break;

                          if(j*2+1>max){

                                   max=j*2+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=j*2+2;

                                   x=p[i-j];

                                   y=p[i+j+1];

                          }

                  }

         }

         for(i=x;i<=y;i++){

                  printf("%c",buf[i]);

         }

         return 0;

}

小结与习题

必要的存储量:需要二次加工的则需要数组保存

 

用ASCII码表示字符:

如果用八进制:\o,\oo或\ooo

十六进制:\xh(A~F表示10~15)

Windows自带科学计算器中可以转换

Printf(“%d %o %x”,a)可以把整数分别按十进制、八进制、十六进制输出

 

补码表示法:

二进制没有符号,负号可用一个二进制位表示(会出现+0-0)

机器中使用补码表示:-n用(2^32)-n

int是32位,其中一半表示负数,则表示范围:-2^(32-1)~2^(32-1)-1

重新实现库函数

练习1:只用getchar函数读入一个整数,假设它占据单独的一行,读到行末为止,包括换行符。输入保证读入的整数可以保存在int中

这个解答是一刷的时候写的,太沙雕了,详见下题练习二解答吧,这道就不另外写了

#include<stdio.h>

#include<string.h>

#include<ctype.h>

 

int main(){

         int a[20],i=0,n ;

         memset(a,0,sizeof(a));

         while(1){

                  a[i]=getchar();

                  if((a[i]==-1)||(char)a[i]=='\n')break;

//              printf("%c",a[i]);

                  i++;

         }

         n=i;

         for(i=0;i<=n;i++){

                  printf("%c",a[i]);

         }

         return 0;

}

练习2,只用fgets函数读入一个整数,假设它占据单独的一行,读到行末为止,包括换行符。输入保证读入的整数可以保存在int中。

思路:

占据单独一行,包括换行符,大概指的是输入的格式吧

输入保证整数可以保存在int,大概指的是整数大小在int范围内

那么题意用fgets读入,实现类似sscanf

字符串转整数,这次就不严格地用函数调用了

从后往前转较方便,找到字符串末尾

判断是数字,则转为整数存入

#include<stdio.h>
#include<math.h>
int main(){
	char buf[20];//读入字符串 
	int power=0;//位值为10的幂 
	int cur=0;//读取位置 
	int sum=0;//最后的整数 
	fgets(buf,20,stdin);
	while(buf[cur]!='\0')cur++;//挨个判断是否\0也可,strlen也可 
	for(power=0,cur-=1;cur>-1;cur--){//在不能用分号的时候,可以用逗号分隔 
		if('0'<buf[cur]&&buf[cur]<'9'){//<是二目运算符,不能连续判断 
			//计算位值*当前数值 ,也可用幂循环得位值
			sum+=(int)(buf[cur]-'0')*pow(10,power++); 
			//power只在当前位是数字时加(算作数字位数 
		}	
	}
	printf("%d",sum);
	return 0;
}

练习3:用getchar实现fgets功能,即用每次一个字符的方式读取整行

int __cdecl getchar(void);

char *__cdecl fgets(char * __restrict__ _Buf,int _MaxCount,FILE * __restrict__ _File);

fgets功能:

从文件结构体指针stream中读取,

\n,文件结尾,或字符数超过bufsize-1停止,末尾加上’\0’,

成功返回buf,出错或文件结尾返回NULL,

超过bufsize-1下次调用继续该行。

思路:

文件结构体指针不熟悉,而且getchar也是从标准输入读的,就不考虑最后一个参数啦

char * fgets(char * Buf,int MaxCount);

EOF通常是-1,也有可能依系统有所不同

#include<stdio.h>
char * myFgets(char * buf,int maxCount){
	int ch,i=0;
	while(i<maxCount&&(ch=getchar())!=EOF) {
		*(buf+i)=(char)ch;
		if(ch=='\n')break;
		i++;
	}
	if(i>0){
		*(buf+i)='\0' ;
		return buf;
	}
	else return NULL;
} 
int main(){
	char buf[20];
	myFgets(buf,20);
	printf("%s",buf);
	return 0;
}

练习4:实现strchr,在字符串中查找字符

#include<stdio.h>
char* myStrchr(char* s,char c){
	int i=0;
	for(i=0;s[i]!='\0';i++){
		if(c==s[i]){
			return &s[i];
		}
	}
	return NULL;
}
int main(){
	char a[20]="abcde";
	char b;
	scanf("%c",&b);
	printf("%s",myStrchr(a,b));
	return 0;
}

#include<stdio.h>

#include<string.h>

 

int main(){

         char a;

         int i=0,n ;

         scanf("%c",&a);

         n=(int)a;

         if(n>47&&n<58){

                  printf("isdigit");

         }else if(n>64&&n<123){

                  printf("isalpha");

         }else{

                  printf("-1");

         }

         return 0;

}

关于输入输出:

getchat()何时返回?如果直接输入文件结束符(Windows Ctrl+Z,Linux Ctrl+D),读到什么?

换行符返回。%c返回null,%d-1

 

#include<stdio.h>

#include<string.h>

int main(){

         char s[10]="12:34:56";

         int a,b,c;

         sscanf(s,"%d:%d:%d",&a,&b,&c);

         printf("%d\t%d\t%d",a,b,c);

         return 0;

}

I/O的效率

输入多行字符串,直接输出

C++字符串

cin.getline读取多个字符(包括空白字符)直到结束符

         getline (cin, stri)返回cin,cin再转换为bool值true(读入成功)或者false(读入失败)

stringstream 是字符串流,相当于一个大的缓冲区,很多类型的数据都可以存储,也可以从中读出,就像文件流一样。
stringstream ss(s);//定义了一个字符串流,并用一个字符串初始化
ss << i;// 将i读入到ss中去
cout <<ss.str(); // 以字符串的形式输出ss中的所有内容

#include<iostream>

#include<sstream>

using namespace std;

int main(){

         char s[1000];

         cin.getline(s,1000,’\n’);

         stringstream ss(s);

         int a=0,b=0;

         ss>>a>>b;//接受2个整数,中间只能隔空格、teb

         cout<<a<<'\t'<<b<<endl;

         cout<<a+b<<"\n";

         return 0;

}

getchar循环

#include<cstdio>

using namespace std;

int main(){

         int ch;

         while((ch=getchar())!=EOF)putchar(ch);

         return 0;

}

用整型存放字符串,getchar在回车时返回

赋值语句本身有值,可以在读取时同时判断是否为EOF

Fgets

出错或者到文件结尾返回NULL

#include<cstdio>

using namespace std;

#define MAXN 100010

char s[MAXN];

int main(){

         int ch;

         while(fgets(s,MAXN,stdin)!=NULL)puts(s);

         return 0;

}

使用bug注意-数组与字符串

  1. 访问非法内存:

访问数组前检查下标是否合法,

定义数组时适当开大,

数组大小可以通过sizeof在编译时获得(它不是函数,但经常用在memset、memcpy)

  1. 存在缓冲区溢出漏洞的函数:gets、strcpy(源字符串不是’\0’结尾,则复制工作覆盖到缓冲区外内存)
  2. 安装自己的方式处理字符串时要保证’\0’结尾

中文GBK编码:大多情况如果char值为正,则为西文,为负,则是汉字前一半

在函数中接收参数定义int []与int*

当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

 

3.1分数统计

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#define MAXN 100+10

float a[MAXN],b[MAXN][2];

int main(){

         int i,j,n=0,max,num=0;

         memset(b,0,sizeof(b));

         while(scanf("%f",&a[n])==1){

                  n++;

//              printf("%d\t%d\n",n,a[n-1]);

         }

 

         for(i=0;i<n;i++){

                  for(j=0;j<num;j++){

                          if(a[i]==b[j][0]){

                                   b[j][1]++;

                                   break;

                          }

                  }

                  if(j>=num){

                          b[j][0]=a[i];

                          b[j][1]++;

                          num++;

                  }

         }

        

         max=b[0][1];

         n=0;

         for(i=0;i<num;i++){

                  if(b[i][1]>max){

                          max=b[i][1];

                          n=1;

                  }else if(b[i][1]==max){

                          n++;

                          a[n-1]=b[i][0];

                  }

         }

         for(i=0;i<n;i++){

                  printf("%.2f\t",a[i]);

         }

         return 0;

}

3.2单词长度

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#define MAXN 100+10

int a[MAXN];

int main(){

         int i,n=0;

         float avr=0;

         char s[11];

         while(scanf("%s",s)==1){

//              printf("%d",strlen(s));

                  a[n++]=strlen(s);

         }

         for(i=0;i<n;i++){

                  avr+=a[i];

         }

         avr/=n;

         printf("%f",avr);

         return 0;

}

3.3乘积的末三位

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#include<sstream>

#include<iostream>

using namespace std;

#define MAXN 100+10

char a[MAXN];

int b[MAXN];

int main(){

         int i=0,n=0,pro=1;

        

         while((a[i++]=getchar())!=EOF){

                  if(isalpha(a[i-1])){

                          i--;   

                  }

         }

         a[i++]='\0';

         n=i;i=0;

         stringstream ss(a);

         while(ss>>b[i++]);//这里i会多+1

         n=i-1;i=0;

         for(i=0;i<n;i++){

                  pro=pro*b[i]%1000;

//              printf("%d\n",pro) ;

         }              

         printf("%d",pro) ;

         return 0;

}

其他思路

处理输入的字符串,提取数字并转整型

 

3.4计算器

#include<stdio.h>

#include<string.h>

#include<ctype.h>

 

int main(){

         int a,b,res;

         char opr;

         scanf("%d%c%d",&a,&opr,&b);

//     printf("%d%c%d",a,opr,b);

         if(opr=='+'){

                  res=a+b;

         }else if(opr=='-'){

                  res=a-b;

         }else if(opr=='*'){

                  res=a*b;

         }

         printf("%d",res);

         return 0;

}

Scanf返回条件

scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF

scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:

(1)遇空格、“回车”、“跳格”键;

(2)遇宽度结束;

(3)遇非法输入。

3.5旋转

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#define N 3

int main(){

         char a[N][N];

         int i,j;

         for(i=0;i<N;i++){

                  for(j=0;j<N;j++){

                          scanf("%c",&a[i][j]);

                          getchar();

                  }

         }

 

         for(j=N-1;j>=0;j--){

                  for(i=0;i<N;i++){

                          printf("%c ",a[i][j]);

                  }

                  printf("\n");

         }

         return 0;

}

进制转换

3.6十进制转其他

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define N 11
int main(){
	int b,n,a[N],i=0;
	scanf("%d%d",&b,&n);
	while(n>0){
		a[i++]=n%b;//最低位为进制余数
//		n/=b;
		n=(n-(n%b))/b;//减去已存的,剩下的除以进制对齐到最低位
	}
	while(i>0){
		printf("%d",a[--i]);
	}
	
	return 0;
}

3.7转为十进制

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define N 11
int main(){
	int b,n,i,fig=1,sum=0;
	scanf("%d%d",&b,&n);
	while(n>0){
		if(fig==1)sum+=(n%10)*1;
//		printf("%d %d\n",i,sum);
		for(i=1;i<fig;i++){//计算次幂
			sum+=(n%10)*b;//取出最低位,*b^(n-1)
//			printf("%d %d\n",i,sum);
		}
		n=(n-(n%10))/10;//对齐到最低位
		fig++;
		
	}
	printf("%d",sum);
	return 0;
}

3.8手机键盘

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#define N 11

int main(){

         char s[N] ;

         int i,n;

         scanf("%s",s);

         for(i=0;i<strlen(s);i++){

                  printf("%c",s[i]);

                  //n=(int)s[i]-'a';

                  if((int)s[i]<(int)'p'){

                          n=((int)s[i]-'a')%3;

                  }else if((int)s[i]<=(int)'s'){

                          n=((int)s[i]-'p');

                  }else if((int)s[i]<(int)'w'){

                          n=((int)s[i]-'t');

                  }else if((int)s[i]>=(int)'w'){

                          n=((int)s[i]-'w');

                  }

                  printf("%d",n+1);

         }

         return 0;

}

缓冲区刷新:(清除输入时的垃圾)

1.fflush(stdin)
    
   头文件: include<stdio.h>
   清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串

后紧接着又要读取一个字符,此时应该先执行fflush(stdin);)。

  **st是标准的意思,in指的是输入 
  fflush(stdin)是C中的一个函数,用来刷新缓冲区,如果刷新成功返回的是 0,指

定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。

例: 
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    fflush(stdin);
    scanf("%c",&ch);
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}
输入: 23       输出:23
       a              a
如果不加 fflush(stdin); 则输出的是 23 32 ,因为没有fflush(stdin)时第二个ch

接受的是 回车而不是 a;


2.getchar();
   
  头文件: #include<stdio.h>

   它的作用是单个的读取缓冲区里的数据,只能单个的读取; 用户输入的数据先存

放在缓冲区里,然后当执行getchar()时读取缓冲区里的相对第一个字符。如果出错

返回 -1。 
   利用它只能单个读取字符的特性可以用它来清除部分输入时留下的垃圾。
例:
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    getchar();//如果没有getchar();则ch接受的数据将会是输入时留下的垃圾
              //空格或者是回车;在这里相当必要!!!
    scanf("%c",&ch);
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}


3. %*nc

   n的值是可以根据而要而改变的,表示的是 吸收的字符的个数。用法和 getchar()

相像,只不过它可以很方便的改变吸收的字符的个数。

例:
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    scanf("%*%c",&ch);// 如果没有 %*c 输出的ch是“垃圾”,加上后就正确了
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值