HDOJ 2152 Fruit

题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=2152

母函数…稍微变化了一点。。。还是可以直接套模版的。
注意对母函数的灵活运用。

可以看: 母函数(Generating function)详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;
// Author: Tanky Woo
// www.wutianqi.com
const int _max = 101; 
// c1是保存各项质量砝码可以组合的数目
// c2是中间量,保存没一次的情况
int c1[_max], c2[_max];
int down[_max], up[_max]; 
int main()
{
	//freopen("input.txt", "r", stdin);
	int nNum, M;   // 
	int i, j, k;
 
	while(cin >> nNum >> M)
	{
		for(i=1; i<=nNum; ++i)
			scanf("%d %d", &down[i], &up[i]);
		for(i=0; i<=M; ++i)   // ---- ①
		{
			c1[i] = 0;
			c2[i] = 0;
		}
		for(i=down[1]; i<=up[1]; ++i)
			c1[i] = 1;
		for(i=2; i<=nNum; ++i)   // ----- ②
		{
 
			for(j=0; j<=M; ++j)   // ----- ③
				for(k=down[i]; k+j<=M && k<=up[i]; k++)  // ---- ④
				{
					c2[j+k] += c1[j];
				}
			for(j=0; j<=M; ++j)     // ---- ⑤
			{
				c1[j] = c2[j];
				c2[j] = 0;
			}
		}
		cout << c1[M] << endl;
	}
	return 0;
}

BUCT OJ 1040 X倍数问题

题目地址:
http://coder.buct.edu.cn/oj/Problem.aspx?pid=1040

高精~~~当然,打表也可以过的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
void fun(char* s,int n)
{
    char* p=s;
    int temp,jinwei;
    for(*p=n+'0', jinwei=0;!(*p=='0'&&jinwei==1);p++)
        ((temp = (*p-'0')*n+jinwei)>9)?(*(p+1)=temp%10+'0',jinwei=temp/10):(*(p+1)=temp+'0',jinwei=0);
    *++p='1',*++p='\0';
    _strrev(s);
}
int main() 
{ 
    char s[200];
	printf("0\n1\n");
    for (int i = 2; i <= 9; i++) 
    {
        fun(s,i);
        printf("%s\n", s);
    }
    return 0; 
}

C++输入一行字符串的一点小结

大家在学习C++编程时,一般在输入方面都是使用的cin.
而cin是使用空白(空格,制表符和换行符)来定字符串的界的。
这就导致了对于带有空格的字符串,比如”I Love www.CppLeyuan.com”
只能读入”I”,后面的都无法读入。
这时怎么办?
(论坛:www.cppleyuan.com)

 一.对于字符数组
方法一:getline()
读入整行数据,它使用回车键输入的换行符来确定输入结尾。
调用方法: cin.getline(str, len);
第一个参数str是用来存储输入行的数组名称,第二个参数len是要读取的字符数。

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
 
int main()
{
	char str[30];
	cin.getline(str, 30);
	cout << str << endl;
	return 0;
}

方法二:get()

调用方法:cin.get(str, len);

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
 
int main()
{
	char str[30];
	cin.get(str, 30);
	cout << str << endl;
	return 0;
}

那么两者有何区别?
两者都读取一行输入,直至换行符。
然后,getline将丢弃换行符,而get()将换行符保留在输入序列里
所以,再使用cin.get()输入多行数据时,中间可以使用get()消除换行符。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
	char str1[30], str2[30];
	cin.get(str1, 30);
	cin.get();
	cin.get(str2, 30);
	cout << "str1: " << str1 << endl;
	cout << "str2: " << str2 << endl;
	return 0;
}

因为get(str, len)和get()都是cin的类成员,所以可以合并起来写:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main()
{
	char str1[30], str2[30];
	cin.get(str1, 30).get();   // 注意这里!
	cin.get(str2, 30);
	cout << "str1: " << str1 << endl;
	cout << "str2: " << str2 << endl;
	return 0;
}

(欢迎大家去我论坛学习:C++奋斗乐园http://www.cppleyuan.com)

二.对于string类
方法一:getline(cin, str)

这说明这里的getline不是类方法。

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
	string str;
	getline(cin, str);
	cout << str << endl;
	return 0;
}

PS:以后如果对输入方面还有更多了解,会继续补充,希望大家支持,多多交流。

数组初始化的一点小细节

1.首先,只有在定义数组时才能使用初始化,此后就不能用了,也不能将一个数组赋给另一个数组。

1
2
3
4
int right[4] = {1, 2, 3, 4};   // ok
int right[4];  // ok
wrong[4] = {1, 2, 3, 4};   // wrong
wrong = right;   // wrong

2.如果只对数组的一部分进行初始化,则编译器将其他的元素设置为0;
所以,将所有元素初始化为0,只需要把第一个元素初始化为0即可。
而如果只初始化第一个为1,则其他的元素都为0;

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
 
int main()
{
	int a[3]={1};
	cout << a[0] << ", "<< a[1] << ", " << a[2] << endl;
	return 0;
}

良好的编程习惯(每天更新)

这是我根据自己每天学到的,遇到的,把编程习惯总结起来。

里面有我在学习编程时看到书上介绍的好的编程风格,

也有网上推荐的好的风格,

或者是自己编程是感觉这样优美而为自己设置的风格,

里面也有相当一部分会来至《C++大学教程》,这本书很好,耐心看完,相信收获会很多的。

我觉得,每个人都应该有自己的编程风格,并且保持下去,当然,有些风格是不好的,这时就要借鉴大家的。

就比如:  for(int i=0;i<10;++i) 和 for(int i = 0; i < 10; ++i)

前者虽然没错,但是不好看,这就是最好要避免的,下面还会介绍好多,希望大家和我一起走过这个编程风格总结的旅程。

这篇贴子每天我会更新的。


1.每个程序的开始都应该有一个注释,用来描述这个程序的目的,作者,日期和时间。

2.使用空行和空格来增加程序的可读行。

3.在限定函数体的花括号之间把整个函数体缩进一级。这样可以使程序的函数结构更清晰,使程序更容易阅读。

4.在判断一个变量是否等于某个值时,大家一般喜欢if(ch == 8),这种虽然是对的,但是如果手喜欢不小心颤抖的,或一边聊天一边coding…这就危险了。。。因为你可能会把if(ch == 8) 打成 if(ch = 8).这个结果我就不说了,只能说要悲剧了~~~解决方法: if(8 == ch)这样就可以解决问题,就算你少打了一个”=”,编译器也会提示你错误的。要记住了!这是公认的好习惯。