测了一下,花费是字符串时间的1/6左右 /// <summary> /// 求num在n位上的数字 /// </summary> /// <param name="num">正整数</param> /// <param name="n">所求数字位置</param> int findIt(int num, int n) { int power = 1; for (int i = 0; i < n; i++) { power *= 10; } return (num - num / power * power) * 10 / power; }
在VMM失误时,开个玩笑。 :)上面的方法中,5楼效率最高。private void button1_Click(object sender, EventArgs e) { int m, n = 123456; DateTime dt1 = DateTime.Now;
for (int i = 0; i < 100000000; i++) { m = n - n / 10 * 10; }
DateTime dt2 = DateTime.Now; for (int i = 0; i < 100000000; i++) { m = n % 10; }
private void button1_Click(object sender, EventArgs e) { int m; int tick = Environment.TickCount; int times = 100000000; for (int i = 0; i < times; i++) { m = 102456116 - 102456116 / 10 * 10; } tick = Environment.TickCount - tick; int tick2 = Environment.TickCount; for (int i = 0; i < times; i++) { m = 102456116 % 10; } tick2 = Environment.TickCount - tick2; MessageBox.Show(tick.ToString()); // 281 MessageBox.Show(tick2.ToString()); // 282}
直接取余未必快啊,怎么我这里测试的结果是相反的呢? 乘除耗时:00:00:00.5236724 取余耗时:00:00:00.5544903 我是每次取不同的数,你们的是取相同的数 class Program { static Stopwatch watch = new Stopwatch(); static Stopwatch watch2 = new Stopwatch(); static void Main( string[] args ) { int m,n; watch2.Start(); for (int i = 100000; i < 100000000; i++) { //n = i / 10; n = i; m = n - n / 10 * 10; } watch2.Stop(); Console.WriteLine("乘除耗时: {0}", watch2.Elapsed); watch.Start(); for (int i = 100000; i < 100000000; i++) { //n = i / 10; n = i; m = n % 10; } watch.Stop(); Console.WriteLine("取余耗时: {0}", watch.Elapsed); GC.Collect(); Console.ReadLine(); }
你的公式只是找到余数而已,除以1百万 n=1346436457 n - n / 1000000 * 1000000 = 436457 (n%10000000)/1000000 取个余再除 我们应该想办法找到比这个更快的呀
个位 int a = 1001; int b = a % 10
int getOne(int num) { return num%10; }int getN(int num,int n) { if(n == 1) return getOne(num); int div = 1; for(int i = 1; i < n;i++) div *= 10; int ret = num/div; return getOne(ret); }
Tostring().Substring(n-1,1);
Console.WriteLine((n- n / 10* 10).ToString());
int i = 2;
int t = n / Math.Power(10, i-1); //去尾
int r = t % 10; //取最后一位
哈哈,VMM现身了。怎么感觉你就是一个“不懂装懂”的回贴人啊。
/// 求num在n位上的数字
/// </summary>
/// <param name="num">正整数</param>
/// <param name="n">所求数字位置</param>
int findIt(int num, int n)
{ int power = 1;
for (int i = 0; i < n; i++)
{
power *= 10;
}
return (num - num / power * power) * 10 / power;
}
在VMM失误时,开个玩笑。 :)上面的方法中,5楼效率最高。private void button1_Click(object sender, EventArgs e)
{
int m, n = 123456; DateTime dt1 = DateTime.Now;
for (int i = 0; i < 100000000; i++)
{
m = n - n / 10 * 10;
}
DateTime dt2 = DateTime.Now; for (int i = 0; i < 100000000; i++)
{
m = n % 10;
}
DateTime dt3 = DateTime.Now; MessageBox.Show((dt2 - dt1).Milliseconds.ToString()); // 868
MessageBox.Show((dt3 - dt2).Milliseconds.ToString()); // 765
}
{
int m; int tick = Environment.TickCount; int times = 100000000;
for (int i = 0; i < times; i++)
{
m = 102456116 - 102456116 / 10 * 10;
}
tick = Environment.TickCount - tick; int tick2 = Environment.TickCount;
for (int i = 0; i < times; i++)
{
m = 102456116 % 10;
}
tick2 = Environment.TickCount - tick2; MessageBox.Show(tick.ToString()); // 281
MessageBox.Show(tick2.ToString()); // 282}
乘除耗时:00:00:00.5236724
取余耗时:00:00:00.5544903
我是每次取不同的数,你们的是取相同的数 class Program
{ static Stopwatch watch = new Stopwatch();
static Stopwatch watch2 = new Stopwatch();
static void Main( string[] args )
{
int m,n; watch2.Start();
for (int i = 100000; i < 100000000; i++)
{
//n = i / 10;
n = i;
m = n - n / 10 * 10;
}
watch2.Stop();
Console.WriteLine("乘除耗时: {0}", watch2.Elapsed); watch.Start();
for (int i = 100000; i < 100000000; i++)
{
//n = i / 10;
n = i;
m = n % 10;
}
watch.Stop();
Console.WriteLine("取余耗时: {0}", watch.Elapsed); GC.Collect();
Console.ReadLine();
}
如果去个位数
n%=10;
其他位数
n%=10^(i+1);
n/=10^(i-1);
兄弟,没感觉出来是开玩笑吗? VMM的实力有目共睹,不用我们为其辩护。
兄弟,你在22楼贴上了一个错误的测试用例,结果是随机的,不能证明任何问题。原因吗?你现在应该知道为什么了。哈哈,是否说明你是一个“不懂装懂”的回贴人? 看了阿非宣传的“知不知”理论,不敢回贴了 :)
IL是我的软肋,我没说我理解这其中曲直,只是把你贴的例子测试,并没有你贴的结果那么明显,并且我尝试用常量来替换后,得到结果是和你的不同,对IL这层我的确不懂,我只是用我测试的结果来说,你可以说任何一个人不懂装懂,这个都成立,所有人都有不懂的地方。这句话只说明了你讨论问题时候喜欢人身攻击而不是讨论问题本身。这类话题到此为止,那谁了解IL,帮我解释一下使用变量和不使用变量,为什么生成的IL会差别这么大把。实在没看明白。
code1:int m;
int times = 100000000;
for (int i = 0; i < times; i++)
{
m = 102456116 - 102456116 / 10 * 10;
}对应ILL_000c: stloc.1
L_000d: ldc.i4 0x5f5e100
L_0012: stloc.2
L_0013: ldc.i4.0
L_0014: stloc.3
L_0015: br.s L_001f
L_0017: nop
L_0018: ldc.i4.6
L_0019: stloc.0
L_001a: nop
L_001b: ldloc.3
L_001c: ldc.i4.1
L_001d: add
L_001e: stloc.3
L_001f: ldloc.3
L_0020: ldloc.2
L_0021: clt
L_0023: stloc.s CS$4$0000
L_0025: ldloc.s CS$4$0000
L_0027: brtrue.s L_0017
int m = 102456116;
int times = 100000000;
for (int i = 0; i < times; i++)
{
m = m - m / 10 * 10;
}
L_000c: stloc.1
L_000d: ldc.i4 0x5f5e100
L_0012: stloc.2
L_0013: ldc.i4.0
L_0014: stloc.3
L_0015: br.s L_0027
L_0017: nop
L_0018: ldloc.0
L_0019: ldloc.0
L_001a: ldc.i4.s 10
L_001c: div
L_001d: ldc.i4.s 10
L_001f: mul
L_0020: sub
L_0021: stloc.0
L_0022: nop
L_0023: ldloc.3
L_0024: ldc.i4.1
L_0025: add
L_0026: stloc.3
L_0027: ldloc.3
L_0028: ldloc.2
L_0029: clt
L_002b: stloc.s CS$4$0000
L_002d: ldloc.s CS$4$0000
L_002f: brtrue.s L_0017
光做测试怎么行啊?CPU温度变化都有影响
直接看汇编代码好了
在我的机器上,改变先后顺序、改变循环上下界,n次运行的结果都是一致的:
那就是 n-n/10*10 比 n%10 快另外,取百万位的数只要先除以一百万即可,没有问题的
你的公式只是找到余数而已,除以1百万
n=1346436457
n - n / 1000000 * 1000000 = 436457
(n%10000000)/1000000 取个余再除 我们应该想办法找到比这个更快的呀
int a = 1001;
int b = a % 10
{
return num%10;
}int getN(int num,int n)
{
if(n == 1)
return getOne(num);
int div = 1;
for(int i = 1; i < n;i++)
div *= 10;
int ret = num/div;
return getOne(ret);
}