for的穷举、迭代
for的穷举
把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况。
例:
单位给发了一张150元购物卡,
拿着到超市买三类洗化用品。
洗发水15元,香皂2元,牙刷5元。
求刚好花完150元,有多少种买法,
每种买法都是各买几样?
设洗发水 x 150/15==10
牙刷 y 150/5==30
香皂 z 150/2==75
int biao = 0;
int sum = 0;
for (int x = 0; x <= 10; x++)
{
for (int y = 0; y <= 30; y++)
{
for (int z = 0; z <= 75; z++)
{
sum++;
if (x * 15 + y * 5 + z * 2 == 150)
{
biao++;
Console.WriteLine("这是第" + biao + "种买法:洗发水" + x + "瓶,牙刷" + y + "支,香皂" + z + "块。");
}
}
}
}
Console.WriteLine("共有" + biao + "种买法!");
Console.WriteLine(sum);
Console.ReadLine();
例:
百鸡百钱:公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只,总共只有100文钱,
如何在凑够100只鸡的情况下刚好花完100文钱?
设g m x
g + m + x = 100;g*2+m+x*0.5=100
int n = 0;
for (int g = 1; g * 2 <= 100; g++)
{
for (int m = 1; m <= 100; m++)
{
for (int x = 1; x * 0.5 <= 100; x++)
{
if (g * 2 + m + x * 0.5 == 100 && g + m + x == 100)
{
Console.WriteLine(g + "只公鸡" + m + "只母鸡" + x + "只小鸡" + "一共有" + (g + m + x) + "只鸡");
n++;
}
}
}
}
Console.WriteLine(+n + "种可能性");
Console.ReadLine();
例:
大马驼2石粮食,
中等马驼1石粮食,
两头小马驼1石粮食,
要用100匹马,驼100石粮食,该如何分配?
设 d z x d*2+z+(0.5*x)=100;d+z+x=100;
int n = 0;
for (int d = 1; d * 2 <= 100; d++)
{
for (int z = 1; z <= 100; z++)
{
for (int x = 1; 0.5 * x <= 100; x++)
{
if (d * 2 + z + 0.5 * x == 100 && d + z + x == 100)
{
Console.WriteLine("需要大马" + d + "头,中等马" + z + ",小马" + x + "头。");
n++;
}
}
}
}
Console.WriteLine(n);
Console.ReadLine();
例:
有1分钱,2分钱,5分钱的硬币,要组合出来2角钱,有几种组合方式,分别各多少个?
int sum = 0;
for (int x = 0; x <= 20; x++)
{
for (int y = 0; y <= 10; y++)
{
for (int z = 0; z <= 4; z++)
{
if (x + 2* y + 5* z == 20)
{
Console.WriteLine("一分钱 " + x + "个,两分钱 " + y + " 个,五分钱 " + z + " 个!");
sum++;
}
}
}
}
Console.WriteLine(sum);
Console.ReadLine();
迭代:
从初始情况按照规律不断求解中间情况,最终推导出结果。
例:
纸张可以无限次对折,纸张厚度为0.07毫米。
问多少次对折至少可以超过8848?
int a = 7;//884800000
int i = 1;
for (; ; )
{
a *= 2;//a=a*2;
if (a >= 884800000)
{
Console.WriteLine(i);
Console.WriteLine(a);
break;
}
i++;
}
int a = 7;//884800000
int i = 1;
while(true)
{
a *= 2;
if (a >= 884800000)
{
Console.WriteLine(i);
Console.WriteLine(a);
break;
}
i++;
}

浙公网安备 33010602011771号