關(guān)于 輸入 問(wèn)題的注意:
- 數(shù)組在main函數(shù)中的定義的無(wú)法定義的很大,所以大數(shù)據(jù)的數(shù)組一般定義在main函數(shù)外面
- scanf("%s") 碰到 "\0"、空格熬词、TAB 會(huì)停止
- fgetc(fin) 讀取一個(gè)打開的文件 fin 碰到 EOF 會(huì)停止
EOF 并不是char類型,因此 fgetc不會(huì)返回 char,而是返回 int類型 - getchar() 從標(biāo)準(zhǔn)輸入讀取一個(gè)字符 == fgetc(stdin)
Windows 回車符:"\r\n" Windows下讀取次回車符笤妙,fgetc冒掌、getchar 只讀取 "\n"
Linux 回車符:"\n" Linux 下讀取Win的回車符,fgetc蹲盘、getchar 會(huì)讀取 "\r\n"
MacOS 回車符:"\r" 同 Linux - fgets(buf, maxn, fin) 碰到 "\n"股毫、EOF 會(huì)停止
buf 的聲明為 char buf[maxn] fgets函數(shù)讀取不超過(guò) maxn-1個(gè)字符,然后在末尾添加 "\0"
一個(gè)字符都沒(méi)有讀到時(shí) fgets 返回 NULL - gets(s) 碰到 "\n"召衔、EOF 會(huì)停止
從標(biāo)準(zhǔn)輸入中讀取字符串铃诬,但 沒(méi)有指明讀取的最大字符數(shù)
會(huì)不停的往 s 存儲(chǔ)內(nèi)容,不管是否存儲(chǔ)的下「存在緩沖區(qū)溢出漏洞」
C11標(biāo)準(zhǔn)里 gets函數(shù)已經(jīng)刪除
3-1 「UVa1585」得分:給出一個(gè)由O和X組成的串(長(zhǎng)度為1~80)苍凛,統(tǒng)計(jì)得分趣席。每個(gè)O得分為目前連續(xù)出現(xiàn)的O的個(gè)數(shù),X得分為0.例如醇蝴,OOXXOXOOOX的得分為 1+2+0+0+1+0+0+1+2+3
#include<stdio.h>
#define MAX 100
int main() {
char str[MAX];
scanf("%s", str);
int sum,cO;
sum=cO=0;
for (int i=0; str[i]!='\0'; i++){
if (str[i]=='O'){
cO++;
sum += cO;
printf("%d", cO);
}else{
cO=0;
printf("%d", 0);
}
if(str[i+1]!='\0'){
printf("+");
}else{
printf("=");
}
}
printf("%d\n", sum);
return 0;
}
3-2 「UVa1586」分子量:給出一種物質(zhì)的分子式(不帶括號(hào))求分子量吩坝。本題分子只包含4種原子,分別為C,H,O,N 分子量為分別為12.01哑蔫,1.008钉寝,16.00,14.01(單位:g/mol)例如:C6H5OH 的分子量為 94.108g/mol
#include<stdio.h>
#include<string.h>
#include<ctype.h>//int isdigit(int,char)需要的頭文件
#define MAX 20
double getWeight(char c){
double w = 0;
switch (c) {
case 'c':
case 'C': w = 12.01;break;
case 'h':
case 'H': w = 1.008;break;
case 'o':
case 'O': w = 16.00;break;
case 'n':
case 'N': w = 14.01;break;
}
return w;
}
int main() {
char str[MAX];
scanf("%s", str);
if(isdigit(str[0])){//isdigit判斷字符是不是數(shù)字
printf("輸入格式錯(cuò)誤闸迷!\n");
return 0;
}
double weight = 0;
double sum = 0;
for (int i=0; i<strlen(str);i++){
int num = 1;
for(int pre=0; isdigit(str[i]);i++){
num = pre*10+str[i]-'0';
pre = num;
}
sum += num * weight; //weight = str[i-1]'s weight
if(i<strlen(str)) weight = getWeight(str[i]); //weight = str[i]'s weight
}
sum += weight;//加上最后一次循環(huán)的原子量
printf("分子量為:%.3lfg/mol\n", sum);
return 0;
}
3-3「UVa1225」數(shù)數(shù)字:把前n(n<=1000)個(gè)整數(shù)順次寫在一起:89101112...數(shù)一數(shù)09各出現(xiàn)多少次(輸出10個(gè)整數(shù)嵌纲,分別是09出現(xiàn)的次數(shù))
#include<stdio.h>
#include<string.h>
#define MAX 1000000
char str[MAX];
// windows下獨(dú)有一個(gè) char *ito(int 要轉(zhuǎn)換的數(shù),char *轉(zhuǎn)換后的數(shù)組位置,int 轉(zhuǎn)換后的進(jìn)制數(shù)) 函數(shù)
// 它在 stdlib.h 中,是 將數(shù)字轉(zhuǎn)化為字符串 的函數(shù)
void itoa(int n,char *s){
int sign;
char tmp[100];
if((sign=n)<0)//記錄符號(hào)
n=-n;//使n成為正數(shù)
int i=0;
do{
tmp[i++]=n%10+'0';//取下一個(gè)數(shù)字
}while((n/=10)>0);//刪除該數(shù)字
if(sign<0) tmp[i++]='-';
for(int j=i-1,k=0; j>=0; j--,k++)//生成的數(shù)字是逆序的腥沽,所以要逆序輸出
s[k] = tmp[j];
s[i]='\0';
}
int main() {
int n;
scanf("%d",&n);
int count[10]={0};//每個(gè)標(biāo)號(hào)存儲(chǔ)對(duì)應(yīng)的數(shù)字出現(xiàn)的次數(shù)
char tmp[10];
for (int i=n; i<=10000; i++) {
itoa(i, tmp);
strcat(str,tmp);//將字符串tmp添加到str后面逮走,并返回添加后的數(shù)組
}
for(int i=0; i<strlen(str); i++)
count[str[i]-'0']++;
for (int i=0; i<10; i++)
printf("Times of %d is %d\n",i,count[i]);
return 0;
}
//注:本題也可直接根據(jù)數(shù)學(xué)方法求出,不過(guò)公式的推導(dǎo)較浪費(fèi)時(shí)間今阳,方法不在列出
3-4「UVa455」周期串:如果一個(gè)字符可以由某個(gè)長(zhǎng)度為k的字符串重復(fù)多次得到师溅,則稱該串以k為周期。例如:abcabcabcabc 以3為周期(注意:它也以6和12為周期)輸入一個(gè)長(zhǎng)度不超過(guò)80的字符串盾舌,輸出其最小周期墓臭。
#include<stdio.h>
#include<string.h>
#define MAX 80
int main() {
char str[MAX];
scanf("%s",str);
int len = strlen(str);
for (int i=1; i<len; i++){
if (len%i == 0){ //如果i為最小周期,那么字符串長(zhǎng)度必定是i的整數(shù)倍
int flag = 1;
for (int j=i; j<len; j++) //判斷數(shù)組是否已i為周期
if (str[j-i] != str[j]) flag = 0;
else break;
if (flag){
printf("最小周期為:%d \n",i); //輸出對(duì)應(yīng)的周期
break; //如果flag不為0妖谴,那么退出循環(huán)
}
}
}
return 0;
}
開燈問(wèn)題:有n盞燈窿锉,編號(hào)為1~n。第1個(gè)人把所有燈打開膝舅,第2個(gè)人按下所有編號(hào)為2的倍數(shù)的開關(guān)(這些燈將被關(guān)掉)嗡载,第3個(gè)人按下所有編號(hào)為3的倍數(shù)的開關(guān)(其中關(guān)掉的燈將會(huì)打開,打開的燈將會(huì)關(guān)掉)仍稀,依次類推洼滚。一共有k個(gè)人,問(wèn)最后有那些燈開著技潘?輸入n和k遥巴,輸出 開著 的燈的編號(hào)千康。k<=n<=10000
樣例輸入
7 3
樣例輸出
1 5 6 7
#include<stdio.h>
#include<string.h>//memset
#define MAX 1010
int a[MAX];
int main()
{
int n, k, first=1;
memset(a,0,sizeof(a));//把數(shù)組清 0
scanf("%d%d",&n,&k);
for(int i=1; i<=k; i++)
for(int j=1; j<=n; j++)
if(j%i == 0) a[j] = !a[j];
for(int i=1; i<=n; i++)
if(a[i]){
if(first) first=0;//避免輸出多余空格
else printf(" ");
printf("%d", i);
}
printf("\n");
return 0;
}
蛇形填數(shù):在nxn方陣?yán)锾钊?,2挪哄,3吧秕,...琉闪,nxn,要求填成蛇形迹炼。例如:n=4時(shí)的方陣為:「下面方陣,多余的 '_' 只是為了便于觀察颠毙,不必嚴(yán)格輸出斯入,n<=8」
10 11 12 1
_9 _6 13 2
_8 15 14 3
_7 _6 _5 4
#include<stdio.h>
#define MAXN 50
int main()
{
int a[MAXN][MAXN]={0};//給數(shù)組清0
int num,n,x,y;
scanf("%d",&n);
num = a[x=0][y=n-1] = 1;
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(int y=0; y<n; y++)
printf("%5d",a[x][y]);
printf("\n");
}
return 0;
}