【问题标题】:Is there a possible loop for this?有没有可能的循环?
【发布时间】:2014-09-15 15:14:29
【问题描述】:

我刚开始学习 C#,只知道非常基础的东西。所以这个问题对你来说可能很容易,但对我来说很难。答案越详细越好。

下一行代码将检查学号是真还是假。当所有字符的总和(乘以它们的位号)为 11 的倍数时,该数字为实数。

Console.WriteLine("What is your studentnumber?");
stnum = Console.ReadLine();

var stnumint = Convert.ToInt32(stnum);

var ans1 = (stnumint % 10 - stnumint % 1) / 1;
var ans2 = (stnumint % 100 - stnumint % 10) / 10;
var ans3 = (stnumint % 1000 - stnumint % 100) / 100;
var ans4 = (stnumint % 10000 - stnumint % 1000) / 1000;
var ans5 = (stnumint % 100000 - stnumint % 10000) / 10000;
var ans6 = (stnumint % 1000000 - stnumint % 100000) / 100000;
var ans7 = (stnumint % 10000000 - stnumint % 1000000) / 1000000;

var control = ans1 * 1 + ans2 * 2 + ans3 * 3 + ans4 * 4 + ans5 * 5 + ans6 * 6 + ans7 * 7;

var endnum = control % 11;

if (endnum == 0)
{
    Console.WriteLine("You have got a valid studentnumber.");
}
else
{
    Console.WriteLine("Check if your studentnumber is correct. If it is, you are not a student.");
}

以学生号 9232753 为例。计算:(9*7 + 2*6 + 3*5 + 2*4 + 7*3 + 5*2 + 3*1) % 11 时,答案将为 0。

如何将这行代码写成更小的循环?

【问题讨论】:

  • 这是家庭作业吗?
  • 提示:什么是 100 / 10、1000 / 100 和 10000 / 1000,...

标签: c# loops console console-application


【解决方案1】:

一个等效的循环是:

int control = 0;
int power10 = 1;  // var to save an expensive `Math.Power` call
for (int i = 1; i <= 7; i++)
{
    control += ((stnumint % (power10*10) - stnumint % power10) / power10) * i;
    power10 *= 10;
}

我强烈建议不要var 用于intstring 等内置类型。您将生成的类型留给编译器支配,编译器可以为您提供意想不到的结果。当 actual 类型在设计时难以(或不可能)确定时,请保存 var

【讨论】:

  • 我不同意你关于 var 的建议。类型仅由其后的赋值决定。如果类型一目了然(即var i = 1;),则使用 var,仅当带有 var 的代码不清楚时才使用实际类型。让 var 成为规则,而不是例外。这将为您节省大量时间(并使重构变得更加容易)。
【解决方案2】:
var totalAns = 0;
for (int i = 1; i <= 10000000; i *= 10)
{
    ans += (stnumint % (10*i) - stnumint % i) / i;
}

【讨论】:

    【解决方案3】:

    这里是计算部分。如果您需要保存 stnumint,请复制另一个变量。

    int stnumint=...; //must be sure, that data type is n
    int checksum=0;
    int i=1;
    
    while(stnumint>0)
    {
        checksum=(stnumint%10)*i;
        i++;
        //in real numbers will look like floor(stnumint/10)
        //will automaticly floor because of data type int
        stnumint=stnumint/10;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多