一夜发白《千字文》

题目信息

请编写一个程序,从输入中读取一篇中文文章,并统计出该文章中 ASCII 字符以外的重复出现的每一个字重复出现的次数。
文章使用 UTF-8 编码,可能会出现任何可以用 UTF-8 编码表示的字符(不限于中文)。
文章中所有的字符在 UCS-2 能够表示的范围内,即字符的 Unicode 值用两个字节就可以表示。

输入

一篇文章,总字数不限、每行字符数不限。每个字重复出现的次数不超过 60000 空格 次。

输出

按照 Unicode 编码从小到大的顺序,输出文章中 ASCII 左括号 0 雙點 127 右括号 字符以外的每一个重复出现过的字重复出现的次数。每行包含三项内容,首先是重复的字符(以 UTF-8 编码输出),然后是该字符的 Unicode 编码值(十六进制输出,字母均使用小写,长度不足 4 位数的用 0 补齐),最后输出该字符的重复次数。
如果文章中没有出现重复的字,则输出No repeat!

测试样例

测试样例1

Qianzi wen in Simplified Chinese
天地玄黄 宇宙洪荒 日月盈昃 辰宿列张 寒来暑往 秋收冬藏 闰馀成岁 律吕调阳
云腾致雨 露结为霜 金生丽水 玉出昆冈 剑号巨阙 珠称夜光 果珍李柰 菜重芥姜
海咸河淡 鳞潜羽翔 龙师火帝 鸟官人皇 始制文字 乃服衣裳 推位让国 有虞陶唐
吊民伐罪 周发殷汤 坐朝问道 垂拱平章 爱育黎首 臣伏戎羌 遐迩一体 率宾归王
鸣凤在竹 白驹食场 化被草木 赖及万方 盖此身发 四大五常 恭惟鞠养 岂敢毁伤
女慕贞洁 男效才良 知过必改 得能莫忘 罔谈彼短 靡恃己长 信使可复 器欲难量
墨悲丝染 诗赞羔羊 景行维贤 克念作圣 德建名立 形端表正 空谷传声 虚堂习听
祸因恶积 福缘善庆 尺璧非宝 寸阴是竞 资父事君 曰严与敬 孝当竭力 忠则尽命
临深履薄 夙兴温凊 似兰斯馨 如松之盛 川流不息 渊澄取映 容止若思 言辞安定
笃初诚美 慎终宜令 荣业所基 籍甚无竟 学优登仕 摄职从政 存以甘棠 去而益咏
乐殊贵贱 礼别尊卑 上和下睦 夫唱妇随 外受傅训 入奉母仪 诸姑伯叔 犹子比儿
孔怀兄弟 同气连枝 交友投分 切磨箴规 仁慈隐恻 造次弗离 节义廉退 颠沛匪亏
性静情逸 心动神疲 守真志满 逐物意移 坚持雅操 好爵自縻 都邑华夏 东西二京
背邙面洛 浮渭据泾 宫殿盘郁 楼观飞惊 图写禽兽 画彩仙灵 丙舍傍启 甲帐对楹
肆筵设席 鼓瑟吹笙 升阶纳陛 弁转疑星 右通广内 左达承明 既集坟典 亦聚群英
杜稿钟隶 漆书壁经 府罗将相 路侠槐卿 户封八县 家给千兵 高冠陪辇 驱毂振缨
世禄侈富 车驾肥轻 策功茂实 勒碑刻铭 磻溪伊尹 佐时阿衡 奄宅曲阜 微旦孰营
桓公匡合 济弱扶倾 绮回汉惠 说感武丁 俊乂密勿 多士寔宁 晋楚更霸 赵魏困横
假途灭虢 践土会盟 何遵约法 韩弊烦刑 起翦颇牧 用军最精 宣威沙漠 驰誉丹青
九州禹迹 百郡秦并 岳宗泰岱 禅主云亭 雁门紫塞 鸡田赤城 昆池碣石 巨野洞庭
旷远绵邈 岩岫杳冥 治本于农 务资稼穑 俶载南亩 我艺黍稷 税熟贡新 劝赏黜陟
孟轲敦素 史鱼秉直 庶几中庸 劳谦谨敕 聆音察理 鉴貌辨色 贻厥嘉猷 勉其祗植
省躬讥诫 宠增抗极 殆辱近耻 林皋幸即 两疏见机 解组谁逼 索居闲处 沉默寂寥
求古寻论 散虑逍遥 欣奏累遣 戚谢欢招 渠荷的历 园莽抽条 枇杷晚翠 梧桐蚤凋
陈根委翳 落叶飘摇 游鹍独运 凌摩绛霄 耽读玩市 寓目囊箱 易輶攸畏 属耳垣墙
具膳餐饭 适口充肠 饱饫烹宰 饥厌糟糠 亲戚故旧 老少异粮 妾御绩纺 侍巾帷房
纨扇圆絜 银烛炜煌 昼眠夕寐 蓝笋象床 弦歌酒宴 接杯举觞 矫手顿足 悦豫且康
嫡后嗣续 祭祀烝尝 稽颡再拜 悚惧恐惶 笺牒简要 顾答审详 骸垢想浴 执热愿凉
驴骡犊特 骇跃超骧 诛斩贼盗 捕获叛亡 布射僚丸 嵇琴阮啸 恬笔伦纸 钧巧任钓
释纷利俗 竝皆佳妙 毛施淑姿 工颦妍笑 年矢每催 曦晖朗曜 璇玑悬斡 晦魄环照
指薪修祜 永绥吉劭 矩步引领 俯仰廊庙 束带矜庄 徘徊瞻眺 孤陋寡闻 愚蒙等诮
谓语助者 焉哉乎也
云 0x4e91 2
发 0x53d1 2
巨 0x5de8 2
戚 0x621a 2
昆 0x6606 2
资 0x8d44 2

测试样例2

Qianzi wen in Traditional Chinese
天地玄黃 宇宙洪荒 日月盈昃 辰宿列張 寒來暑往 秋收冬藏 閏馀成歲 律呂調陽
雲騰致雨 露結爲霜 金生麗水 玉齣崑岡 劍號巨阙 珠稱夜光 果珍李柰 菜重芥姜
海鹹河淡 鱗潛羽翔 龍師火帝 鳥官人皇 始制文字 乃服衣裳 推位讓國 有虞陶唐
吊民伐罪 周發殷湯 坐朝問道 垂拱平章 愛育黎首 臣伏戎羌 遐迩一體 率賓歸王
鳴鳳在竹 白駒食場 化被草木 賴及萬方 蓋此身髮 四大五常 恭惟鞠養 豈敢毀傷
女慕貞絜 男效才良 知過必改 得能莫忘 罔談彼短 靡恃己長 信使可複 器欲難量
墨悲絲染 詩贊羔羊 景行維賢 克念作聖 德建名立 形端表正 空谷傳聲 虛堂習聽
禍因惡積 福緣善慶 尺璧非寶 寸陰是競 資父事君 曰嚴與敬 孝當竭力 忠則盡命
臨深履薄 夙興溫凊 似蘭斯馨 如松之盛 川流不息 淵澄取映 容止若思 言辭安定
笃初誠美 慎終宜令 榮業所基 籍甚無竟 學優登仕 攝職從政 存以甘棠 去而益詠
樂殊貴賤 禮別尊卑 上和下睦 夫唱婦隨 外受傅訓 入奉母儀 諸姑伯叔 猶子比兒
孔懷兄弟 同氣連枝 交友投分 切磨箴規 仁慈隱恻 造次弗離 節義廉退 顛沛匪虧
性靜情逸 心動神疲 守真志滿 逐物意移 堅持雅操 好爵自縻 都邑華夏 東西二京
背邙面洛 浮渭據泾 宮殿盤郁 樓觀飛驚 圖寫禽獸 畫彩仙靈 丙舍傍啓 甲帳對楹
肆筵設席 鼓瑟吹笙 升階納陛 弁轉疑星 右通廣內 左達承明 既集墳典 亦聚群英
杜稿鍾隸 漆書壁經 府羅將相 路俠槐卿 戶封八縣 家給千兵 高冠陪辇 驅毂振纓
世祿侈富 車駕肥輕 策功茂實 勒碑刻銘 磻溪伊尹 佐時阿衡 奄宅曲阜 微旦孰營
桓公匡合 濟弱扶傾 绮回漢惠 說感武丁 俊乂密勿 多士寔甯 晉楚更霸 趙魏困橫
假途滅虢 踐土會盟 何遵約法 韓弊煩刑 起翦頗牧 用軍最精 宣威沙漠 馳譽丹青
九州禹迹 百郡秦並 嶽宗泰岱 禅主云亭 雁門紫塞 雞田赤城 昆池碣石 鉅野洞庭
曠遠綿邈 岩岫杳冥 治本於農 務兹稼穑 俶載南畝 我藝黍稷 稅熟貢新 勸賞黜陟
孟轲敦素 史魚秉直 庶幾中庸 勞謙謹敕 聆音察理 鑒貌辨色 贻厥嘉猷 勉其祗植
省躬譏誡 寵增抗極 殆辱近恥 林臯幸即 兩疏見機 解組誰逼 索居閑處 沈默寂寥
求古尋論 散慮逍遙 欣奏累遣 慼謝歡招 渠荷的曆 園莽抽條 枇杷晚翠 梧桐蚤凋
陳根委翳 落葉飄搖 遊鹍獨運 淩摩绛霄 耽讀玩市 寓目囊箱 易輏攸畏 屬耳垣牆
具膳餐飯 適口充腸 飽饫烹宰 饑厭糟糠 親戚故舊 老少異糧 妾禦績紡 侍巾帷房
纨扇圓潔 銀燭炜煌 晝眠夕寐 藍筍象床 弦歌酒宴 接杯舉觞 矯手頓足 悅豫且康
嫡後嗣續 祭祀烝嘗 稽颡再拜 悚懼恐惶 箋牒簡要 顧答審詳 骸垢想浴 執熱願涼
驢騾犢特 駭躍超骧 誅斬賊盜 捕獲叛亡 布射僚丸 嵇琴阮嘯 恬筆倫紙 鈞巧任釣
釋紛利俗 竝皆佳妙 毛施淑姿 工颦妍笑 年矢每催 曦晖朗曜 璇玑懸斡 晦魄環照
指薪修祜 永綏吉劭 矩步引領 俯仰廊廟 束帶矜莊 徘徊瞻眺 孤陋寡聞 愚蒙等诮
謂語助者 焉哉乎也
No repeat!

解答

#include <cstring>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

class character
{
public:
    unsigned char ch[3];
    unsigned long unicode;
    int count;//出现的次数
    int m;//字节数

    character()
    {
        memset(ch, 0, sizeof(ch));
        count = 0;
    }
};

character characters[65536];

int main()
{
    //ios::sync_with_stdio(false);
    //freopen("E://test.txt", "r", stdin);
    //freopen("E://out.txt", "w", stdout);
    unsigned char tmp;
    while ((tmp = getchar()) != 255)
    {//对所有文件进行扫描
        if (tmp >= 0 && tmp <= 127)
        {//单独的ASCII
            continue;
        }
        else if (tmp >= 192 && tmp <= 223)
        {//两个字符的汉字
            character tmpchar;
            tmpchar.ch[0] = tmp;
            tmpchar.ch[1] = getchar();
            tmpchar.m = 2;
            tmpchar.unicode = (tmpchar.ch[0] - 128 - 64) * 64 + (tmpchar.ch[1] - 128);

            characters[tmpchar.unicode].ch[0] = tmpchar.ch[0];
            characters[tmpchar.unicode].ch[1] = tmpchar.ch[1];
            characters[tmpchar.unicode].unicode = tmpchar.unicode;
            characters[tmpchar.unicode].count++;
        }
        else if (tmp >= 224 && tmp <= 239)
        {//三个字符的汉字
            character tmpchar;
            tmpchar.ch[0] = tmp;
            tmpchar.ch[1] = getchar();
            tmpchar.ch[2] = getchar();
            tmpchar.m = 3;
            tmpchar.unicode = (tmpchar.ch[0] - 128 - 64 - 32) * 4096 +
                (tmpchar.ch[1] - 128) * 64 + (tmpchar.ch[2] - 128);

            characters[tmpchar.unicode].ch[0] = tmpchar.ch[0];
            characters[tmpchar.unicode].ch[1] = tmpchar.ch[1];
            characters[tmpchar.unicode].ch[2] = tmpchar.ch[2];
            characters[tmpchar.unicode].unicode = tmpchar.unicode;
            characters[tmpchar.unicode].count++;
        }
    }
    int op = 0;
    for (int i = 0; i < 65536; i++)
    {
        if (characters[i].count >= 2)
        {
            op = 1;
            printf("%s 0x%04x %d\n", characters[i].ch, characters[i].unicode, characters[i].count);
        }
    }
    if (op == 0)
    {
        cout << "No repeat!" << endl;
    }
    return 0;
}

想法

由于编译器不能显示中文,可以使用文件读入和文件写入的方式来查看中文

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
千字文背景 在古代中国,《三字经》、《百家姓》、《千字文》被合称为三、百、千,都是非常重要的启蒙教育课本,广为流传。而其中问世最早的《千字文》更凭借其优美的文字、华丽的辞藻成为中华传统文化的一个重要组成部分,得到了人们的普遍重视和喜爱。 《千字文》的作者,是梁武帝时代官拜散骑员外郎的周兴嗣。历来在正史上的记载,就这样一笔带过,但据私家笔记的野史记载,内容不是这样简单了。周兴嗣同梁武帝本来便是文字之交的朋友,在萧齐时代,还在朝廷上有过同僚之谊。到了梁武帝当了皇帝,那就变成君臣的关系。由朋友变君臣,说是关系不错,其实,伴君如伴虎,反是最糟糕的事,周兴嗣有一次不小心得罪了梁武帝,梁武帝一怒之下,想杀他或很严厉地处分他,到底还是于心不忍,只好下令把先关起来再说。但梁武帝又说了一句话,你不是文才很好吗?你能在一夜之间,把一千个不同的字,写一篇好文章,就赦你无罪。因此,周兴嗣就在一夜之间,挖空心思,写了这篇《千字文》。文章写好了,可是在一夜之间,头发、眉毛、胡子也都白了!大家要注意,用一千个不同的中文字,一夜之间,写出有关宇宙、物理、人情、世故的文间,等于写了一篇非常精简的“中国文化纲领要点”,虽然,只写到南北时期的梁朝为止,实在也太难了。梁武帝本人,才华文学都自命不凡,看了周兴嗣一夜之间之间所写的《千字文》,也不能不佩服。周兴嗣因此得到宽恕,而且还特加赏赐。 ——摘自南怀瑾《原本大学微言》 现代人,一生中有机会通读千字文的机会是非常少的,很多理工科的大学生,完全没有听说过这篇神奇的文章,自然也会抱着“怀疑一切”的态度问,真的有这么神吗,真的一个重复的字都没有吗?耳听为虚,眼见为实,我们就来检验一下千字文中是不是真的没有重复的字。 不过在动手之前,先让我们花上几分钟的时间,读读《千字文》吧:简体中文版、正体中文版。 任务 请编写一个程序,从输入中读取一篇中文文章,并统计出该文章中 ASCII 字符以外的重复出现的每一个字重复出现的次数。 文章使用 UTF-8 编码,可能会出现任何可以用 UTF-8 编码表示的字符(不限于中文)。 文章中所有的字符在 UCS-2 能够表示的范围内,即字符的 Unicode 值用两个字节就可以表示。 输入 一篇文章,总字数不限、每行字符数不限。每个字重复出现的次数不超过 60000 次。 输出 按照 Unicode 编码从小到大的顺序,输出文章中 ASCII (0~127) 字符以外的每一个重复出现过的字重复出现的次数。每行包含三项内容,首先是重复的字符(以 UTF-8 编码输出),然后是该字符的 Unicode 编码值(十六进制输出,字母均使用小写,长度不足4位数的用0补齐),最后输出该字符的重复次数。 如果文章中没有出现重复的字,则输出“No repeat!”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhj12399

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值