您的位置:首页 > 其它

算法竞赛入门经典第3章总结

2014-07-17 15:51 204 查看
P47: 用getchar 读入int

// P47 use getchar input a int
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
int a[10];
int bit = 1;
int sum = 0;
int i = 0;
while((a[i] = getchar()) && a[i] != '\n')
{
sum = sum * 10 + (a[i] - '0');
}
printf("%d\n", sum);
return 0;
}

2、用fgets读入int
#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
char a[10];
int sum = 0;
fgets(a, 10, stdin);

for(int i = 0; a[i] != '\n'; ++i)
{
sum = sum * 10 + a[i] - '0';
}

printf("%d\n", sum);
return 0;
}

3、用getchar实现fgets

#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
char a[80];
int i = 0;
while((a[i] = getchar() )&& a[i] != '\n')
{
i++;
}
a[i] = '\0';
puts(a);
return 0;
}

4、实现strchr
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100;

int main()
{
char a[maxn];
fgets(a, maxn, stdin);
char c = 'c';
int len = strlen(a);

for(int i = 0; i < len; ++i)
{
if(a[i] == c)
{
printf("%x\n", sizeof(char) * i + a); /// strchr
}
}
return 0;
}

5、实现   ctype.h    中的isalpha 和 isdigit
#include <iostream>
#include <ctype.h>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100;

int main()
{
char a[maxn];
fgets(a, maxn, stdin);
int len = strlen(a);
int c1, c2, c3, c4;

c1 = c2 = c3 = c4 = 0;
for(int i = 0; i< len; ++i)
{
if(isalpha(a[i]))
c1++;
if(isdigit(a[i]))
c2++;
if(a[i] >= '0' && a[i] <= '9')
c3++;
if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))
c4++;
}

cout << c1 << endl;
cout << c2 << endl;
cout << c3 << endl;
cout << c4 << endl;
return 0;
}

字符串处理的常见问题#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;
const int maxn = 1000000;
char s[maxn];

int main()
{
//fgets(s, maxn, stdin);
for(int i = 0; i < 1000000; ++i)
{
s[i] = (rand() % 26) + 'a';
}
int tot = 0;
int len = strlen(s);

for(int i = 0; i < len; ++i)
{
if(s[i] == 'a')
tot++;
}
printf("There are %d character(s) '1' in the string.\n", tot);
printf("Time = %0.2lf\n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
sscanf()输入

// sscanf http://www.cnblogs.com/kex1n/archive/2011/06/09/2076501.html #include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
int a, b, c;
char s[20] = "12:34:56";
sscanf(s, "%2d:%2d:%2d", &a, &b, &c);
printf("%d %d %d\n", a, b, c);
return 0;
}

P50:上机练习

3、乘积的末3位

#define LOCAL
#include <cstdio>
#include <iostream>
#include <ctype.h>
#include <cstring>
using namespace std;

int main()
{
#ifdef LOCAL
freopen("data11.in", "r", stdin);
freopen("data11.out", "w", stdout);
#endif
char a[10];
int bit[10] = {1};
int sum = 1;
int cnt = 0;
for(int i = 1; i < 10; i++)
{
bit[i] = bit[i-1]*10;
//printf("%d\n", bit[i]);
}

while(scanf("%s", a) != EOF)
{
int tag = 0;
if(isalpha(a[0])) continue;

if(a[0] == '-')
{
tag = 1;
cnt++;
}
int aa = 0;
int len = strlen(a);
if(tag == 1)
{
for(int i = len -1, j = 0; i > 0; --i)
{
aa += (a[i] - '0') * bit[j++];
}
}
else
{
for(int i = len - 1, j = 0; i >=0; --i) /// -_-! (++)!
{
aa += (a[i]-'0') * bit[j++];
}
}

sum = (sum%1000) * (aa % 1000);
}
printf("%d\n", sum%1000);
return 0;
}

4、计算器
#define LOCAL
#include <cstdio>
#include <cstring>
#include <iostream>
#include <ctype.h>
using namespace std;

int main()
{
#ifdef LOCAL
freopen("data12.in", "r", stdin);
freopen("data12.out", "w", stdout);
#endif

char *tmp = NULL;
char a[20];
int b, c;
while(fgets(a, 20, stdin) != NULL)
{
for(tmp = a; *tmp != '\n'; ++tmp)
{
if(*tmp == '+' || *tmp == '-' || *tmp == '*')
break;
}

if(*tmp != '\n')
switch(*tmp){
case '+' :
sscanf(a, "%d + %d", &b, &c);
printf("%d\n", c+b);
break;
case '-':
sscanf(a, "%d - %d", &b, &c);
printf("%d\n", b-c);
break;
case '*':
sscanf(a, "%d * %d", &b, &c);
printf("%d\n", c*b);
break;
}
}
return 0;
}

用sscanf进行了输入问题简化

5、旋转(rotate)

#define LOCA
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;
char str[100][100];
char s[100][100];

void revolve(int m, int n)
{
for(int i = m; i <= n; ++i)
{
s
[i] = str[i][m];
}
for(int i = n; i >= m; --i)
{
s[i]
= str
[n+m-i];
}
for(int i = m; i <= n; ++i)
{
s[m][i] = str[i]
;
}
for(int i = n; i >= m; --i)
{
s[i][m] = str[m][n+m-i];
}
return;
}

int main()
{
#ifdef LOCAL
freopen("data13.in", "r", stdin);
freopen("data13.out", "w", stdout);
#endif // LOCAL

FILE *fin, *fout;
fin = fopen("data13.in", "rb");
fout = fopen("data13.out", "wb");
int n;
fscanf(fin, "%d%*c", &n); /// 总是忘记吸收空格,这怎么能行?
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
fscanf(fin, "%c", &str[i][j]);
//printf("%c", str[i][j]);
}
getchar();
}

for(int i = 1, j = n; i <= j; ++i, --j)
{
revolve(i, j);
}

for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
fprintf(fout, "%c", s[i][j]);
}
puts("");
}

fclose(fin);
fclose(fout);
return 0;
}

6、进制转化两题
#include <cstdio>
#include <cstring>
using namespace std;
int trans[32];
int bit;
int base;

int handle(int m, int n)
{
int i = 0;
memset(trans, -1, sizeof(trans));
while(m / n != 0)
{
trans[i++] = m % n;
m /= n;
}
trans[i++] = m % n;
trans[i] = '\0';
return i;
}

int main()
{
FILE *fin, *fout;
fin = fopen("data14.in", "rb");
fout = fopen("data14.out", "wb");

while(fscanf(fin, "%d %d", &base, &bit) == 2)
{
int len = handle(base, bit);
for(int i = len - 1; i >= 0; --i)
{
fprintf(fout, "%d", trans[i]);
}
fprintf(fout, " (%d)\n", bit);
}

fclose(fin); //不要忘记关掉!
fclose(fout);
return 0;
}
#include <cstdio>
#include <cstring>
using namespace std;

int bit;
char base[32];
int res;

int handle(int len, int b)
{
int result = 0;
int bt = b;             ///用以保存bit的数值,下边的核心啊!
for(int i = len-1; i >= 0; --i)
{
result += (i == len-1) ? (base[i] - '0') : (base[i] - '0') * (b / bt);
b *= bt;        ///b *= b 这个不对啊, 增长的也太快了点
}
return result;
}

int main()
{
FILE *fin, *fout;
fin = fopen("data15.in", "rb");
fout = fopen("data15.out", "wb");
//fin = stdin;
//fout = stdout;
while(fscanf(fin, "%s %d%*c", base, &bit) != EOF)
{
fputs(base, fout);
fprintf(fout ,"\nbit is %d\n", bit);
int len = strlen(base);
fprintf(fout ,"len is %d\n", len);
fprintf(fout, "%d\n", handle(len, bit));
}
fclose(fin);
fclose(fout);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息