C语言——验证卡布列克运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言——验证卡布列克运算相关的知识,希望对你有一定的参考价值。

验证卡布列克运算。任意的一个四位数,只要它们各个位上数字不全相同,就有这样的规律,其中三个步骤设计3个函数实现:
a)将组成这个四位数的四个数字由大到小排列,形成由这四个数字构成的最大四位数。
b) 将组成这个四位数的四个数字由小到大排列,形成由这四个数字构成的最小四位数。
c) 求两个数的差,得到一个新的四位数。
重复以上过程,最后得到的结果总是6174.
(写程序步骤,即其各个函数的用法,注:是一个健全的程序,用C++语言)
谢谢啦!

var n,t:integer;

procedure fournum(f:integer;var f1,f2,f3,f4:integer); 取得四位字各位数字的过程
var n1,n2,n3,n4:integer;
begin
n1:=f div 1000;
n2:=(f-n1*1000) div 100;
n3:=(f-n1*1000-n2*100) div 10;
n4:=f mod 10;
f1:=n1;f2:=n2;f3:=n3;f4:=n4;
end;

function pdsame(s:integer):boolean; 判断该数是否不全相同的函数
var p:array[1..4] of integer;
q,r:integer;
begin
fournum(s,p[1],p[2],p[3],p[4]);
pdsame:=true;
for q:=1 to 3 do begin
for r:=q+1 to 4 do begin
if p[q]<>p[r] then pdsame:=false;
end;
end;
end;

procedure kblk(m:integer); 递归过程,卡布列克运算
var num:array[1..4] of integer;
i,j,k,x,y:integer;
begin
if m=6174 then begin
writeln('total times: ',t);
end else begin
fournum(m,num[1],num[2],num[3],num[4]);
for i:=1 to 3 do begin
for j:=i+1 to 4 do begin
if num[i]<num[j] then begin
k:=num[i];
num[i]:=num[j];
num[j]:=k;
end;
end;
end;
x:=num[1]*1000+num[2]*100+num[3]*10+num[4];
y:=num[4]*1000+num[3]*100+num[2]*10+num[1];
writeln(x,' - ',y,' = ',x-y);
t:=t+1;
kblk(x-y);
end;
end;

begin 主程序
readln(n);
if (n<1000) or (n>9999) or (pdsame(n)) then
writeln('wrong input!') else begin
t:=0;
kblk(n);
end;
end.

我再给个C++的实现

#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;

void exchange (int &a,int &b)

int tmp = a;
a = b;
b = tmp;


int fun1(int n)

int a[4];
a[0] = n/1000;
a[1] = n%1000/100;
a[2] = n%100/10;
a[3] = n%10;
sort(a,a+4);
return a[0]*1000+a[1]*100+
a[2]*10+a[3];


int fun2(int n)

int a[4];
a[0] = n/1000;
a[1] = n%1000/100;
a[2] = n%100/10;
a[3] = n%10;
sort(a,a+4);
exchange(a[0],a[3]);
exchange(a[1],a[2]);
return a[0]*1000+a[1]*100+
a[2]*10+a[3];


int main()

int n,a,b;
scanf ("%d",&n);
while (true)

a = fun1(n);
b = fun2(n);
if (a>b) n = a-b;
else n = b-a;
printf ("%d-%d = %d\n",a,b,n);
if (n==6174) break;

system ("pause");
return 0;
参考技术A 我顶

SproutCore 与卡布奇诺

【中文标题】SproutCore 与卡布奇诺【英文标题】:SproutCore vs. Cappuccino 【发布时间】:2011-05-16 08:02:48 【问题描述】:

除了 Javascript 与 Objective-J 的语言差异之外,Cappuccino 与 SproutCore 相比有哪些优势,反之亦然?

就长期预测而言,SproutCore 是否比 Cappuccino 更“受支持”,因为它得到了 Apple 的支持?

我正在尝试在两者之间进行选择。我对 JavaScript 和 Objective-C 都很熟悉。

【问题讨论】:

也许这应该是一个维基?不确定如何将其转换为一个? 鉴于年龄、点赞数、问题的受保护状态以及已接受答案的受欢迎程度,“最新信息”的赏金似乎更适合作为一个新问题,因为所述赏金中提供的上下文本质上会改变问题和答案的性质。 【参考方案1】:

这是一个有趣的问题,在各种消息组、推特甚至 IRC 上都经常出现。有几种方法可以评估 SproutCore 与 Cappuccino 的区别,但也许人们看到的一些直接的 caparisons 如下:

1) 他们各自的功能集 2) 易用性 3) 社区支持和文档

让我们看看第一点——有各自的功能集。通过“功能集”,有几种方法可以查看它。从他们拥有的 UI 小部件的数量来看;将事物连接在一起并与某种后端进行通信的基础支持;框架的一般架构方法,虽然不一定是“特性”,但仍然很重要;而且,是的,甚至是您可以使用的语言。

关于语言,我认为重要的是不要忽视正在使用的内容(JS 与 Obj-J)。为什么?因为收养和你来自哪里。 SproutCore 从 JavaScript 确实是 Web 语言的角度出发,因此您可以使用它来针对框架进行编程。 JavaScript 缺乏语言 OO 完整性(适当的对象-对象继承等)的地方,它在框架中弥补了(例如 MyApp.Foo = SC.Object.extend(...))。卡布奇诺从不同的角度进来。他们使用 Obj-J 作为 JS 的主要语言增强,以注入 JS 缺少的语言特性;这而不是将这些语言功能直接注入框架(Cappuccino)本身。当然,正如 Cappuccino 的人们之前所指出的,您仍然可以使用 JS 来针对 Cappuccino 进行编程,但是,您会错过 Obj-J 提供的功能。卡布奇诺社区注意事项:如果我错了,请纠正我:-)。最后,如果您是已经熟悉 Obj-C 的人,那么 Obj-J 可能更适合您。嘿,甚至索尼现在显然也加入了整个 Obj-C 的潮流,以针对他们的移动平台进行开发:-P。

查看这两个框架的架构,他们都以一种或另一种形式查看了 Apple 的 Cocoa 框架以获取指导/灵感。 Cappuccino 完全把 Cocoa 放在心上,并且基本上移植了 Cocoas API。同样,如果您是使用 Cocoa 在 Apple 中开发应用程序的,那么您可能会有宾至如归的感觉。另一方面,SproutCore 从 Cocoa 中汲取灵感,感觉不错。至于纯架构,它们都遵循 MVC,它们都使用 Cocoa 样式的绑定,它们都有数据存储机制,并且它们都有各自的渲染和组合 UI 小部件/视图的风格。

对我来说,视图的呈现是一个特别重要的领域。这两个框架都有一定程度的抽象,以使您无需直接处理 CSS 和 HTML,即使最终它们必须呈现 Web 浏览器最终能够理解的内容。

在 Cappuccino 方面,它们完全从您那里抽象出 CSS 和 HTML。相反,您使用框架的各种渲染原语来“绘制”您的视图。由于这种抽象级别,Cappuccino 可以利用可用的最佳渲染方法,而不是在某种程度上将您与 CSS 和 HTML 耦合。

至于 SproutCore,可以这么说,您正在渲染更接近“金属”。在对视图进行纯渲染时,您会使用提供一定程度抽象的渲染上下文对象,但最终,您是直接注入 HTML 并添加类名以应用 CSS。即使您的视图已经被渲染并且您想要基于事件来操作视图的某些部分,您也可以直接访问 DOM 元素并操作它们的属性。根据您来自哪里,这可能看起来好或坏。适合那些习惯使用 CSS 和 HTML 并喜欢更直接地控制视图如何呈现和样式的人。如果您想根据浏览器允许的内容(HTML/CSS、SVG、HTML5 画布等)一般地渲染视图以使用最佳渲染方法,那就不好了。但是,请注意,未来计划使 SproutCore 具有更抽象的渲染方法,但如果您愿意,仍允许您直接使用 HTML 和 CSS。所以你最终会得到两全其美的。

现在,至于这两个框架附带的库存 UI 小部件/视图——它们都有很多开箱即用的功能,可以让您继续前进。按钮、标签、列表、分段视图、单选按钮、滚动条等——它们都在那里。因此,可以肯定地说你在两个阵营都很好。

回到过去,现在让我们讨论一下易用性。对我来说,易用性是基于您使用 JavaScript、HTML、Obj-C、Cocoa、其他 MVC 框架、文档和社区支持的个人经验。如果您从未使用过 Cocoa,或者从未构建过类似桌面或 iPad 的应用程序,那么可以公平地说,无论您选择哪种框架,您都会有一些学习曲线。话虽如此,您不知道和想学习的内容可以通过每个框架各自的社区和文档获得。两者都有一个活跃的社区,所以如果你被困在某个地方,你也不会被冷落。至于医生,无可否认,卡布奇诺占据了上风。缺少 SproutCore 的文档,但代码库至少有完整的注释。 SproutCore 社区完全了解需要更新的文档,目前正在处理中,因此请继续检查。

最后,您提到了对这两个框架的长期预测。众所周知,摩托罗拉购买了 Cappuccino 框架,所以你肯定有一家大公司支持它的增长和长寿,或者至少现在看起来是这样。至于 Apple 和 SproutCore,我个人不能代表它们,但 Apple 并不拥有该框架。有许多公司和各种个人都以某种方式使用并回馈该框架。由于框架开发的更加有机的性质,这可能会让一些人和公司暂停或让那些正在关注 SproutCore 的人感到不适,但我不认为这是一个问题。我的感觉是这两个框架都会存在很长时间,尤其是现在越来越多的人正在考虑使用开源框架开发下一代桌面和 iPad 应用程序。而且,嘿,框架之间的竞争是好的——让每个人都保持各自的警觉:-)。

希望这些信息能帮助您做出决定!

干杯,

迈克

【讨论】:

在过去的 10 个月里,您对上述两个框架的看法是否发生了变化? SproutCore 的渲染是不是变得更抽象了?摩托罗拉收购 280north 对卡布奇诺有好处吗?我现在正试图在两者之间做出决定,你的比较很棒。所以我想知道是否有任何值得一提的重大变化。 我非常感谢对此答案的任何更新。近 2 年后的情况现在可能有所不同。 摩托罗拉现在属于谷歌。【参考方案2】:

我想谈谈关于 Objective-j Michael 的 cmets。

如果你使用 JavaScript 而不是 Objective-j,你不会失去任何东西。实际上,区分有点困难,尤其是在我们有免费桥接课程的情况下(稍后会详细介绍)。

Objective-j 实际上只是对 js 的一个薄包装。它提供了传统上作为语言特性实现的经典继承,sproutcore 将其作为框架特性实现,它还提供代码导入、访问器生成、静态作用域以及对消息传递 nil 的支持。

Objective-j 实例变量可以通过传统的点语法访问。也就是说,循环、变量、函数、闭包等都只是 javascript。你不会因为下拉而失去任何东西,这正是语言的设计方式。

我们通过“免费桥接”我们的一些类 CPDate、CPArray、CPException、CPString 以及更多我想不起来的类更进一步。免费桥接只是意味着一个 CPArray 是一个原生 js 数组,一个原生 js 数组是一个 CPArray,所以你可以互换使用这两个世界的方法和函数。

所以例如可以这样做:

var foo = [];
[foo addObject:"bar"];
foo.push("2nd push");
var value = foo[0];
var value2 = [foo objectAtIndex:0];

alert(value === value2); //true

如你所见,我同时使用了 Objective-j 语法和 js 语法……你可以想象这样的力量。

我要说的最后一件事,只是为了确保没有混淆:objective-j 在浏览器中被解析。它不需要事先编译(尽管我们为您准备部署应用程序时提供编译工具)。

我认为有些人被 Objective-j 无谓地推迟了,好像它是需要时间来学习的怪物,虽然 Objective-j 为 js 添加了很多很棒的特性,但真正学习它们并不会真正如果您已经熟悉面向对象编程,那么您可以度过一天的美好时光,而且显然,如果您来自可可,您将能够直接进入。

【讨论】:

【参考方案3】:

我写了一篇关于“cappuccino vs. sproutcore”的博客文章。这不是技术比较,而是比较其他有趣的数据。

http://elii.info/2010/11/cappuccino-vs-sproutcore/

【讨论】:

链接不再有效(截至 2012 年 4 月 24 日)。【参考方案4】:

来自卡布奇诺网站:

“在现有框架的另一端是像 SproutCore 这样的技术。虽然 SproutCore 的目标与 Cappuccino 相似,但它采用了截然不同的方法。它仍然依赖于 HTML、CSS、JavaScript、Prototype 和一个全新的和独特的 API 集。它还需要特殊的开发软件和繁琐的编译步骤。我们认为这是错误的方法。

使用 Cappuccino,您无需了解 HTML。你永远不会写一行 CSS。您永远不会与 DOM 进行交互。我们只要求开发人员学习一种技术,Objective-J 和一组 API。此外,这些技术是众所周知且易于理解的现有技术的实现。开发人员可以利用数十年的集体经验来真正加快构建富 Web 应用程序的步伐。”

因此,Cappuccino 似乎没有/不需要任何构建工具,并且完全将浏览器从开发人员那里抽象出来。而在 Sproutcore 中,您可以获得构建工具(例如开发服务器),并且开发人员应该对 DOM 有所了解。

【讨论】:

更具体地说,Cappuccino 不会强迫您在每次更改后都进行构建,但它确实包含大量工具,旨在优化您的最终发布产品。【参考方案5】:

Michael Cohens 的回答几乎涵盖了所有内容,因为它非常详细。

在过去的 3 周里,我一直在为一个决定而苦苦挣扎。我已经阅读了网络上关于这两个框架的所有内容,并且我已经编写了很多关于这两个框架的源示例,但仍然无法做出决定。以下问题让我从一个框架跳到另一个框架,让我的决定变得更加艰难。

    Sproutcore 的数据存储 API 比卡布奇诺更好。

    Sproutcore 比当前的卡布奇诺更好地利用绑定。 Cappuccino 也有 kvc/kvo 支持,但绑定还不完全存在。例如,在 sproutcore 中,您可以非常轻松地使用绑定和 ArrayController 实现增量加载,而在卡布奇诺中则不那么简单。当然,cappuccino 提供了 CPTableView DataStore api,它非常干净,并且可以实现类似的结果,只是不需要绑定。它是可可在核心数据之前所做的。不过,卡布奇诺一直在研究绑定。

    根据我个人的口味,Cappuccino 有更好的 view api。虽然我习惯于开发 html 和 DOM,但我更喜欢将 DOM 完全抽象出来并摆脱 css 的想法。

    对我来说真正重要的一个问题是在 sproutcore 中缺少一个好的 TableView。目前 SC.TableView 处于 alpha 阶段,它根本没有性能。我不知道 sproutcore 中 tableview 的时间表。我尝试在 irc sproutcore 频道上提问,但没有得到满意的答案。另一方面,Cappuccino 具有出色且非常优化的表格视图。

    我发现在 cappuccino 上编写的实际应用程序比在 sproutcore 上编写的应用程序更多。卡布奇诺还提供了一个相当不错的完整应用程序作为源示例,非常有用。查看http://githubissues.heroku.com/。

尽管我在 Objective-c 方面没有经验,而且我更喜欢纯 js 语法,但我可能会在我当前的项目中使用卡布奇诺,并希望未来 sproutcore 能提供更好的表格视图。

【讨论】:

就卡布奇诺绑定支持而言,您缺少什么?应该很有可能使用 CPArrayController 进行增量加载,因此请务必让团队中的某个人知道是否有错误或怪癖阻碍了您。 我去了卡布奇诺 irc 小组,询问我将如何使用 CPArrayController 实现增量加载。 Ross boucher 告诉我如何并且非常有帮助,但他也告诉我还没有支持,他建议如果我有一个使用 table view 数据源 api 的工作解决方案,我应该坚持下去。说实话,我同意他的看法。 tableview api 非常干净,我使用它没有问题。唯一真正缺少的是一个好的源示​​例和文档。 Sproutcore 使开始变得更容易一些,因为绑定是它们的默认设置。

以上是关于C语言——验证卡布列克运算的主要内容,如果未能解决你的问题,请参考以下文章

卡布列克常数

098.卡布列克常数

dev c语言 输入两数,输入符号进行加减乘除运算,结果不对,求大神改错

高精度问题,C语言,求二的n次方

C语言 集合运算

C语言中位移位运算符?