//此题重在理解两个数相乘的算法,
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#define MAXSIZE 201
8int main()
9{
10 char line1[MAXSIZE];
11 char line2[MAXSIZE];
12 int a1[MAXSIZE];
13 int a2[MAXSIZE];
14 int product[MAXSIZE];
15
16 while ( scanf ("%s%s", line1, line2) != EOF )
17 {
18 int len1, len2;
19 len1 = strlen (line1);
20 len2 = strlen (line2);
21
22 memset (a1, 0, sizeof (a1));
23 memset (a2, 0, sizeof (a2));
24 memset (product, 0, sizeof (product));
25
26 //对负数的处理
27 if ( line1[0] == '-' || line2[0] == '-' )
28 return 0;
29 //对 0 和 其它数相乘的处理
30 int mark = 0;
31 if ( ( !strcmp (line1,"0") ) || ( !strcmp (line2, "0") ) )
32 {
33 printf ("%d", 0);
34 }
35
36 //将字符数转化为数字
37 int j = 0;
38 for (int i = len1 - 1; i >= 0; i--)
39 {
40 a1[j++] = line1[i] - '0';
41 }
42 int k = 0;
43 for (int i = len2 - 1;i >= 0; i--)
44 {
45 a2[k++] = line2[i] - '0';
46 }
47
48 //乘法算法
49 for (int i = 0; i < len2; i++)
50 for (int j = 0; j < len1; j++)
51 {
52 product[i + j] += a1[j] * a2[i];
53 }
54
55 //处理进位
56 for (int i = 0; i < MAXSIZE; i++ )
57 {
58 if ( product[i] >= 10 )
59 {
60 product [i + 1] += product [i] / 10;
61 product [i] = product[i] % 10;
62 }
63 }
64
65 //输出处理
66 bool target = false;
67 for (int i = MAXSIZE - 1; i >= 0; i--)
68 {
69 if (target)
70 printf ("%d", product[i]);
71 else if (product[i])
72 {
73 printf ("%d", product[i]);
74 target = true;
75 }
76 }
77 printf ("\n");
78 }
79 //system ("pause");
80 return 0;
81}
82
以及特殊数据的考虑 :如 含有 0 和 负数时
posted @
2010-08-09 13:08 雪黛依梦 阅读(380) |
评论 (0) |
编辑 收藏
2//1.用字符数组输入
3//2.字符转化为数字进行计算
4//3.数组中下标相同的相加并存入到sum[]中
5//4.进位处理
6//5.存在前导 0 进行输出处理 一定要注意最开始 0 的存储位置 i = 2*MAXSIZE
7#include<stdio.h>
8#include<stdlib.h>
9#include<string.h>
10#define MAXSIZE 100
11int main()
12{
13 char line[MAXSIZE];
14 int a[MAXSIZE];
15 int sum[MAXSIZE + MAXSIZE];
16
17 memset (sum, 0, sizeof(sum));
18 while ( scanf ("%s",line) && strcmp (line, "0") ) //求和终止条件
19 {
20 while ( line[0] == '-')
21 return 0;
22
23 memset (a, 0, sizeof(a));
24
25 //将字符数转化为数字
26 int j = strlen(line);
27 for (int i = j - 1; i >= 0; i--)
28 {
29 a[j-1-i] = line[i] - '0';
30 }
31
32 //将各组数据相加到sum数组中
33 for (int i = 0; i <= MAXSIZE; i++)
34 {
35 sum[i] += a[i];
36 }
37 }
38
39 //对sum【】进行进位的处理
40 for ( int i = 0; i <= 2*MAXSIZE; i++ )
41 {
42 if ( sum[i] >= 10 )
43 {
44 sum[i+1] += (sum[i] / 10);
45 sum[i] = sum[i] % 10;
46
47 }
48 }
49
50 //进行输出处理
51 bool target = false;
52 for ( int i = 2*MAXSIZE ; i >= 0; i--)
53 {
54 if (target)
55 printf ("%d", sum[i]);
56 else if ( sum[i] )
57 {
58 printf ("%d", sum[i]);
59 target = true;
60 }
61 }
62 printf ("\n");
63 //system("pause");
64 return 0;
65}
66
posted @
2010-08-09 13:07 雪黛依梦 阅读(265) |
评论 (0) |
编辑 收藏
其实这道题只要找到了解题的切入口是很简单的 :出现不等号必然是由假币引起的,所以假币在不等式两边出现的次数必然等于所输入的不等号的数。 通过tag 数组记录硬币是否在等号两边出现过,这样的被标记为1,遍历时跳过,没有被标记为 1 的可能是假币,再看数组num中记录的i硬币在不等式出现的次数是否等于不等号的次数
1#include <stdio.h>
2#include <stdlib.h>
3#define MAX 1001
4#define OK 1
5
6int tag[MAX]; //将出现了等号的(即真币)排除 标记为1 遍历时跳过
7int num[MAX]; //记录下标为i的硬币在不等式的两边出现的次数
8
9int main ()
10{
11
12 int coin[MAX]; //访问时下标的中介
13 int N, k, pi, count ;
14 char c;
15
16 while ( scanf ("%d%d", &N, &k) != EOF )
17 {
18 count = 0; //记录接下来的 k 次称量中有多少次出现了不等号
19
20 for ( int i = 0; i < k; i ++) // k 次的称量记录
21 {
22 scanf ("%d", &pi);
23 for (int j = 0; j < 2 * pi; j ++)
24 {
25 scanf ("%d", &coin[j]);
26 }
27
28 getchar ();
29
30 c = getchar ();
31
32 for (int i = 0; i < 2 * pi; i ++)
33 {
34 if (c == '=')
35 tag[coin[i]] = 1;
36
37 else if (c == '<')
38 {
39 count ++;
40 for (int j = 0; j < pi; j ++)
41 {
42 num[coin[j]]--;
43 }
44 for (int j = pi; j < 2 * pi; j++)
45 {
46 num[coin[j]]++;
47 }
48 }
49
50 else
51 {
52 count ++;
53 for (int j = 0; j < pi; j ++)
54 {
55 num[coin[j]]++;
56 }
57 for (int j = pi; j < 2 * pi; j++)
58 {
59 num[coin[j]]--;
60 }
61 }
62 }
63
64 }
65
66 int mark = 0;
67 int temp ;
68 for (int i = 1; i <= N; i ++)
69 {
70 if (tag[i] == 1) //表示为真币,不可能
71 continue;
72
73 if (num[i] == count || num[i] == -count) //如果硬币在不等式的两边出现的次数等于不等号数为假币
74 {
75 mark ++;
76 temp = i;
77 }
78 }
79
80 if (mark == 1) // 假币只有一个
81 {
82 printf ("%d\n", temp);
83 }
84
85 else
86 printf ("%d\n",0);
87
88 }
89
90 return 0;
91}
92
posted @
2010-08-09 13:06 雪黛依梦 阅读(275) |
评论 (0) |
编辑 收藏
摘要: 1.用蛮力解这道题也能AC,虽然测试数据能过但是还是AC了,然后看了一些特殊的数据 24 29 34 2 21251,在修改了一下自己的代码加了一个else语句,就AC了,可是自己都有点不太明白。晕了!!!!
1#include <stdio.h&g...
阅读全文
posted @
2010-08-06 15:58 雪黛依梦 阅读(177) |
评论 (0) |
编辑 收藏
n%3=2,n%5=3,n%7=2 且3,5,7互质 求
n的值:
使5×7被3除余1,用35×2=70;
使3×7被5除余1,用21×1=21;
使3×5被7除余1,用15×1=15。
(70×2+21×3+15×2)%(3×5×7)=23
所以n = 23
posted @
2010-08-06 14:50 雪黛依梦 阅读(275) |
评论 (1) |
编辑 收藏
其实这个题的思路和简单:找到最短的一个串,然后再找到他所有的子串和子串的逆串和所给的串进行匹配。
但是如果不直接调用string.h的函数实现这些功能,我自己就不知道做;
感觉String.h 有好多功能自己不了解,像strstr() strncpy() strrev()可是poj系统不支持这个函数
1#include <stdio.h>
2#include <string.h>
3char str[100][101];
4
5int t, n;
6void strrev (char *revString)
7{
8 int revLen = strlen (revString);
9 char temp[101];
10
11 int i;
12 for ( i = 0; i < revLen; i ++)
13 {
14 temp[i] = revString[revLen - i - 1];
15 }
16 temp [i] = '\0';
17 strcpy (revString, temp);
18}
19
20int searchSubString (char *source)
21{
22 char minSubString[101];
23 char minrevSubString[101];
24
25 int minSubStringLen = strlen (source);
26 int sourceLen = strlen (source);
27
28 while (minSubStringLen)
29 {
30 for (int i = 0; i <= sourceLen - minSubStringLen; i ++)
31 {
32 bool tag = true;
33 strncpy (minSubString, source + i, minSubStringLen);
34 strncpy (minrevSubString, source + i, minSubStringLen);
35
36 minSubString[minSubStringLen] = minrevSubString[minSubStringLen] = '\0';
37
38 strrev (minrevSubString);
39
40 for (int i = 0; i < n; i ++)
41 {
42 if ( strstr (str[i], minSubString) == NULL && strstr (str[i], minrevSubString) == NULL )
43 {
44 tag = false;
45 break;
46 }
47 }
48
49 if (tag)
50 return minSubStringLen;
51 }
52 minSubStringLen --;
53 }
54
55 return 0;
56}
57
58int main ()
59{
60
61 char minStr[101];
62
63 scanf ("%d", &t);
64 while ( t != 0 )
65 {
66 scanf ("%d", &n);
67
68 int minStrlen = 100;
69 for (int i = 0; i < n; i ++)
70 {
71 scanf ("%s", str[i]);
72 if ( ( strlen(str[i]) ) < minStrlen )
73 {
74 strcpy(minStr, str[i]);
75 minStrlen = strlen (str[i]);
76 }
77 }
78
79 int minSubLen = searchSubString (minStr);
80 printf ("%d\n", minSubLen);
81
82 t --;
83 }
84 return 0;
85}
posted @
2010-08-06 11:50 雪黛依梦 阅读(304) |
评论 (0) |
编辑 收藏
WA了一次,主要是自己把continue写成了break,所以遇到素数时下面的输就终止了;
解题思路:如n是素数就直接打印出来,如果不是素数(通过访问0--n下标的tag数组判断n是否为素数,再n依次对素数表prime【】求余求模分解n),就利用打印出来的素数表进行不断地求余、求模分解;直到n为1;
一定要注意怎么输出哦!!!
1#include <stdio.h>
2#include <stdlib.h>
3#define MAXSIZE 65535
4int tag[MAXSIZE + 1];
5int prime[MAXSIZE];
6int cn ;
7
8void is_prime ()
9{
10 for (int i = 2; i < MAXSIZE + 1; i ++)
11 {
12 if ( !tag[i] )
13 prime[cn++] = i;
14 for ( int j = 0 ; (j < cn) && ( i*prime[j] < MAXSIZE + 1 ) ; j ++ )
15 {
16 tag[ i * prime[j] ] = 1;
17 if ( i % prime [j] == 0)
18 break;
19 }
20 }
21}
22
23int main ()
24{
25 is_prime ();
26 int n;
27 int elem[60000];
28 while ( scanf ("%d", &n) != EOF )
29 {
30 if ( !tag[n] )
31 {
32 printf ("%d\n",n);
33 continue;
34 }
35 else
36 {
37 int j = 0;
38 for (int i = 0; i < cn && n != 1 ; i ++)
39 {
40 while ( n % prime[i] == 0 )
41 {
42 elem[j] = prime[i];
43 n = n / prime[i];
44 j ++;
45 }
46 }
47 printf ("%d", elem[0]);
48 for (int m = 1; m < j; m++)
49 {
50 printf ("*%d",elem[m]);
51 }
52 printf ("\n");
53 }
54 }
55 //system ("pause");
56 return 0;
57}
58
posted @
2010-08-06 09:19 雪黛依梦 阅读(400) |
评论 (0) |
编辑 收藏
我晕了!这么水的题,我居然WA了N 次,,,就是自己没有理解好题意最后还对ENDOFINPUT进行了输出处理
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4int main ()
5{
6
char start[11];
7
char end[4];
8
char cipher[201];
9
int len;
10
11
scanf ("%s", start);
12
while ( strcmp (start, "ENDOFINPUT") )
13
{
14
getchar ();
15
16
gets (cipher);
17
18
getchar ();
19
20
scanf ("%s", end);
21
22
//对密文进行解密
23
len = strlen (cipher);
24
for (int i = 0; i < len; i ++)
25
{
26
if ( ('A' <= cipher[i]) && ( cipher[i] <= 'Z') )
27
{
28
if ( 70 <= cipher[i] && cipher[i] <= 90)
29
printf ("%c", cipher[i] - 5);
30
else
31
printf ("%c", cipher[i] + 21);
32
}
33
else
34
printf ("%c", cipher[i]);
35
}
36
printf ("\n");
37
scanf ("%s", start);
38
}
39
//printf ("ENDOFINPUT\n"); 画蛇添足
40
//system ("pause");
41
return 0;
42
}
43
posted @
2010-08-05 16:00 雪黛依梦 阅读(452) |
评论 (0) |
编辑 收藏
这题开始也不知道做,是看了别人的才AC的,感觉数论好高深的。
分析易知:x、y是大于n的;
设y = n + k ( k > = 1),则:x = n 2 / k + n;
所以本题关键是找到使x 为整数的k的个数,
由定理:任何一个正整数都可以表示成两个素数之积,所以本题就被转化成了求n ^2的素因子个数;
n = p1^e1 * p2^e2 * ......*pr^er; 其中p是< n 的素数
那么n 的素因子个数 (e1 + 1) * (e2 + 1) * (e3 + 1)*......
所以:n ^2的素因子数是 (2*e1+1) * (2*e2+1)* (2*e3+1)......
1
//为什么要把范围缩小到n的方根之内呢?? 2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <math.h>
5
# define MAXSIZE 40000
6
7
int prime[MAXSIZE];
8
int primeElem[MAXSIZE];
9
int cn; //0 -- n内素数的个数
10
11
void is_prime ( )
12
{
13
for (int i = 2; i < MAXSIZE; i ++)
14
{
15
if ( !prime [i] )
16
{
17
for (int j = 2 * i; j < MAXSIZE; j += i)
18
{
19
prime [j] = 1;
20
}
21
//把 0 -- n 内的素数存到数组中
22
primeElem[cn ++] = i;
23
}
24
}
25
}
26
27
int main ()
28
{
29
int m, n;
30
is_prime( );
31
32
while ( scanf ("%d", &m) != EOF )
33
{
34
for ( int i = 0; i < m; i ++)
35
{
36
scanf ("%d", &n);
37
38
//找到 n 以内的 素因子
39
int product = 1;
40
int flag = 0;
41
for ( int j = 0; j < cn; j ++)
42
{
43
flag = (int) sqrt (n * 1.0) + 1; //n 的 方根
44
if ( primeElem[j] > flag ) //p1、p2、p3 这些素数要 < n
45
break;
46
int e = 0;
47
while ( n % primeElem[j] == 0 )
48
{
49
e ++;
50
n /= primeElem[j];
51
}
52
product *= ( 1 + 2 * e);
53
}
54
if ( n > 1 )
55
product *= 3; //这步要注意,最后有可能剩下的n本身就是原来n的素因子 ????
56
printf ("Scenario #%d:\n", i+1);
57
printf ("%d\n", ( product + 1 )/2 );
58
59
printf ("\n");
60
}
61
}
62
//system ("pause");
63
return 0;
64
}
65
posted @
2010-08-05 15:18 雪黛依梦 阅读(1354) |
评论 (0) |
编辑 收藏